리눅스에서 최소한 시스템 호출 메커니즘은 일부 레지스터 나 미리 정의 된 메모리 주소에 특정 형식의 데이터 (보통 어떤 종류의 c 구조체)를 배치함으로써 대부분의 아키텍처에서 작동합니다.
그러나 문제는 실제로 CPU가 커널 공간으로 전환하도록하여 권한있는 커널 코드를 실행하여 호출을 처리 할 수있게하는 것입니다. 이것은 일종의 결함 (0으로 나누는 결함, 정의되지 않은 오버플로 또는 segfault 등)을 강제로 수행하여 커널이 결함을 처리하기 위해 실행을 강제로 수행하도록합니다.
일반적으로 커널은 원인 프로세스를 종료하거나 사용자 제공 처리기를 실행하여 결함을 처리합니다. 그러나 syscall의 경우 사전 정의 된 레지스터와 메모리 위치를 대신 확인하고 syscall 요청이 포함 된 경우 메모리 내 구조체의 사용자 프로세스에서 제공 한 데이터를 사용하여 실행합니다. 이 작업은 일반적으로 특수하게 수작업으로 조립해야하며 시스템의 C 라이브러리가 함수로 래핑해야하는 사용자를 위해 syscall을 쉽게 사용할 수 있도록해야합니다. 낮은 수준의 인터페이스는 syscall의 작동 방식과 C 래퍼없이 호출 할 수있는 방법에 대한 정보는 http://man7.org/linux/man-pages/man2/syscall.2.html 을 참조 하십시오 .
이것은 지나치게 단순화 된 것으로 모든 아키텍처에서 적용되는 것은 아니며 (mips에는 특별한 syscall 명령어가 있음) 모든 OS에서 동일하게 작동하지는 않습니다. 그래도 의견이나 질문이 있으면 물어보십시오.
수정 : 참고 : / dev /의 것들에 대한 귀하의 의견과 관련하여 이것은 실제로 커널에 대한 상위 인터페이스가 아니라 하위 인터페이스입니다. 이 장치는 실제로 (약) 4 개의 시스템 콜을 사용합니다. 그들에게 쓰는 것은 쓰기 syscall, 읽기 syscall 읽기, 열기 및 닫기 syscall과 동등한 열림 / 닫기 및 ioctl을 실행하는 것 자체가 시스템의 많은 ioctl 중 하나에 액세스하기위한 인터페이스 인 특별한 ioctl syscall을 발생시킵니다. 호출 (일반적으로 사용량이 너무 좁은 장치 별 호출은 전체 시스템 호출을 작성하기에 너무 좁습니다).