Linux에서 printf와 같은 함수를 호출하면 가상 메모리에서는 정확히 무슨 일이 발생합니까? [폐쇄]

Linux에서 printf와 같은 함수를 호출하면 가상 메모리에서는 정확히 무슨 일이 발생합니까? [폐쇄]

저는 많은 프로세스에서 사용될 수 있고 시스템 호출과 같은 작업을 위해 커널의 도움이 필요한 printf와 같은 기능에 대해 질문하고 있습니다.

무슨 일이 일어났는지에 대한 자세한 단계별 설명은 무엇입니까? 이에 대해 약간 혼란스러워서 다음과 같은 질문이 있습니다.

  1. 사용자 프로세스의 커널 부분에 printf 함수 명령이 있습니까? printf를 시도하면 동일한 사용자 프로세스의 커널 위치에 대해 JMP를 수행하지만 커널 모드로 들어갑니다. 아니면 컨텍스트 전환이 있고 커널 프로세스가 이를 수행합니까?

  2. printf와 같은 기능을 실행하는 모든 프로세스가 가상 메모리에서 printf를 호출할 때 동일한 물리적 메모리 위치에 매핑됩니까?

  3. 일반적으로 커널이 아닌 프로세스가 커널 가상 메모리의 일부를 사용하는 상황은 무엇입니까?

여기에 이미지 설명을 입력하세요.

답변1

  1. printfC 라이브러리로 구현, 커널의 일부가 아닙니다. (커널에는 그 자체로 동등한 것이 어느 정도 있지만 이는 사용자 프로세스에는 적용되지 않습니다.) 따라서 사용자 프로세스 호출은 printf커널을 즉시 호출하지 않습니다. printf의 출력이 기록 되면 이는 호출을 통해 발생합니다.write, 커널에 의해 처리됩니다(C 라이브러리에는 작은 래퍼가 있지만 최소한입니다). 프로세스는 해당 시스템 호출을 호출하고 제어를 커널로 전환하지만 여전히 동일한 프로세스의 컨텍스트에 있습니다.

  2. 실행 파일이나 라이브러리의 코드 페이지는 기본 파일의 동일한 버전에 대해 한 번만 메모리에 로드되므로 printf동일한 물리적 주소(동일한 라이브러리에서 제공하는 경우)에 매핑됩니다.

  3. 가상 메모리의 커널 부분은 커널 코드에서만 액세스할 수 있습니다.

엄밀히 말하면 printf출력은 버퍼에 기록되며 어디에도 기록되지 않을 수 있습니다.

관련 정보