시스템 콜 예제

최근에 x86 프로세서는 int 인터럽트 명령을 사용하는 것보다 시스템 호출을 실행하기 위해 커널에 더 빠르고 전문적인 방법을 제공하는 sysenter라는 기능을 추가했습니다. 이 기능에 대한 지원이 커널에 빠르게 추가되었습니다. 그러나 시스템 호출 처리기가 호출되는 방식에 관계없이 중요한 개념은 사용자 공간으로 인해 예외 또는 트랩이 커널에 들어갑니다. 사용자 공간 응용 프로그램은 시스템 호출을 실행하고 시스템 스위치를 커널 모드로 전환하도록 커널에 신호를 보냄으로써 응용 프로그램을 대신하여 커널을 통해 커널 공간에서 시스템 호출을 실행할 수 있습니다. 이 메커니즘은 소프트웨어 인터럽트: 예외가 발생 하 고 시스템은 커널 모드로 전환 하 고 예외 처리기를 실행 합니다. 이 경우 예외 처리기는 실제로 시스템 호출 처리기입니다. 이러한 시스템 호출은 프로세스 생성, 프로세스 종료 등과 같은 프로세스를 처리합니다. 시스템 호출 번호는 포함/asm-generic/unistd.h 를 포함/asm-generic.h 파일에 정의됩니다. 새 시스템을 사용하면 특정 리소스에 대한 특정 액세스 검사를 수행할 수 있습니다. 호출이 지정된 기능을 보유하고 있고 그렇지 않으면 0이 있는 경우 유효한 기능 플래그가 있는 capable()에 대한 호출은 비0을 반환합니다. 예를 들어, 할 수 있는(CAP_SYS_NICE)은 호출자에게 다른 프로세스의 좋은 값을 수정할 수 있는지 여부를 확인합니다. 기본적으로 수퍼유저는 모든 기능을 보유하며 비루트는 아무 것도 보유하지 않습니다. 시스템 호출이 반환되면 system_call()에서 제어가 계속되며, 궁극적으로 사용자 공간으로 전환되고 사용자 프로세스의 실행을 계속합니다.

(그림 5.2) 예를 들어 가상의 시스템 호출 foo()입니다. 시스템 호출 테이블에 sys_foo()를 추가하려고 합니다. 대부분의 아키텍처에서 테이블은 항목에 있습니다. S와 다음과 같이 보입니다 (새 시스템 호출은이 목록의 꼬리에 추가됨): 그러나 많은 일반 응용 프로그램은 분명히 이러한 구성 요소에 액세스해야하므로 운영 체제에서 시스템 호출을 사용하여 잘 정의되고 안전한 서비스를 제공합니다. 이러한 작업에 대한 구현을 수행할 수 있습니다. 운영 체제는 최고 수준의 권한으로 실행되며 응용 프로그램이 인터럽트를 통해 시작되는 시스템 호출을 통해 서비스를 요청할 수 있습니다. 인터럽트는 자동으로 CPU를 일부 높은 권한 수준으로 이동한 다음 커널에 대한 제어를 전달하여 호출 프로그램에 요청된 서비스를 부여할지 여부를 결정합니다. 서비스가 부여되면 커널은 호출 프로그램이 직접 제어할 수 없는 특정 명령 집합을 실행하고 권한 수준을 호출 프로그램의 권한 수준으로 반환한 다음 호출 프로그램에 대한 제어를 반환합니다. C 라이브러리는 시스템 호출에 대한 지원을 제공합니다. 사용자 응용 프로그램은 표준 헤더에서 함수 프로토타입을 가져오고 C 라이브러리와 연결하여 시스템 호출을 사용할 수 있습니다. [p81] 라이브러리 함수 자체에 대한 호출은 커널 모드로 전환되지 않으며(실행이 커널 모드에 없는 경우) 일반적으로 일반적인 서브루틴 호출입니다(예: 일부 명령 집합 아키텍처(ISA)에서 “CALL” 어셈블리 명령 사용).