Linux 커널은 어떤 프로세스가 시스템 호출을 했는지 어떻게 알 수 있나요? [폐쇄]

Linux 커널은 어떤 프로세스가 시스템 호출을 했는지 어떻게 알 수 있나요? [폐쇄]

프로세스가 파일을 열기 위해 시스템 호출을 한다고 가정합니다. Linux 커널이 이 시스템 호출을 실행할 때 Linux 커널은 fd시스템 호출을 수행한 프로세스의 테이블에 열린 파일을 추가해야 합니다.fd

시스템 호출에 전달된 매개변수에 PID가 포함되어 있지 않을 때 Linux 커널은 어떤 프로세스가 시스템 호출을 했는지 어떻게 알 수 있습니까?

답변1

커널 시스템 호출은 호출 프로세스의 컨텍스트에서 다른 권한 수준과 다른 지원 인프라를 사용하여 실행됩니다. Linux 커널에는 현재 프로세스를 추적하는 CPU별 변수가 있습니다.current_task; 현재 프로세스가 무엇인지 알아야 할 때마다 이것을 사용합니다. 주어진 CPU에서 현재 작업은 스케줄러가 결정할 때만 변경되며 컨텍스트 스위치는 커널이 무슨 일이 일어나고 있는지 추적할 수 있도록 필요한 모든 정보를 저장하도록 주의를 기울입니다.

LWN에는 시스템 호출에 대한 몇 가지 유용한 기사가 있습니다.시스템 호출 분석 1부그리고2 부. 시스템 호출이 정의되는 방법과 이를 실행하는 방법에 대해 설명합니다. 사용자 공간에서 커널 공간으로의 변환에 대해 자세히 설명하지 않기 때문에 실제로 질문에 대답할 만큼 세부 정보가 충분하지 않을 수 있지만 이는 "그냥" 함정입니다. CPU 변환 지원에서 사용할 수 있는 기반 트랩입니다.

답변2

귀하의 질문에 따르면 애플리케이션은 자체 PID를 알고 관리하며 커널이 작업 수행 방법을 알 수 있도록 이를 커널에 전달해야 합니다. 이것은 일반적인 오해입니다. 이 정보가 흐르는 방식은 실제로 그 반대입니다. 프로세스는 프로세스 ID, 파일 설명자 테이블 등을 알거나 저장할 필요가 없습니다. 이에 대한 정보를 얻으려면 다음과 같은 시스템 호출을 사용하여 커널에서 getpid정보를 검색해야 합니다 ioctl.

커널은 여러 줄의 소스 코드로 구성되어 있지만 한쪽에서 실행되는 단일 프로그램은 아닙니다. 사용자 공간 프로그램은 다른 쪽에서 웹 브라우저가 보내는 것처럼 커널에 요청을 보냅니다. 커널에 요청합니다. 네트워크 서버. 시스템 호출 매개변수와 반환 값은 애플리케이션과 커널 사이를 흐르는 유일한 정보가 아니며, 상태(실행 중, 대기 중, 휴면 중...)에 관계없이 각 스레드와 프로세스에 대한 모든 하위 수준 정보가 저장됩니다. 커널 메모리.

시스템에서 실행 중인 모든 프로세스와 관련된 큰 라이브러리와 같은 대부분의 커널 코드를 볼 수 있습니다. 프로세스(실제로는 스레드)가 시스템 호출을 수행할 때 해당 특수 라이브러리에 들어가서 짧은 시간 동안 초능력을 얻습니다. 하지만 여전히 동일한 스레드이므로 커널(여기서는 스케줄러)이기 때문에 소유자, 그룹, PID, 파일 설명자 테이블 등과 같이 실행 중인 스레드를 식별하고 관리하는 데 필요한 모든 정보가 커널에 있습니다. 사용 가능한 (v)CPU에 스레드를 할당합니다.

관련 정보