"시스템 호출"이라는 용어를 이해하고 싶습니다. 나는 사용자 공간 애플리케이션에서 커널 서비스를 얻는 데 사용되는 시스템 호출에 익숙합니다.
명확히 해야 할 부분은 "시스템 호출"과 "시스템 호출의 C 구현"의 차이점입니다.
나를 혼란스럽게 만드는 문장이 있습니다.
Unix 계열 시스템에서 이 API는 일반적으로 호출하는 시스템 호출과 동일한 이름으로 명명되는 시스템 호출에 대한 래퍼 함수를 제공하는 glibc와 같은 C 라이브러리(libc) 구현의 일부입니다.
"그들이 호출하는 시스템 호출"이란 무엇입니까? 그들은 어디에서 왔니? 내 코드에 직접 포함할 수 있나요?
일반적인 의미에서 "시스템 호출"은 단지 POSIX 정의 인터페이스가 아니지만 실제로 구현을 보려면 C 소스 코드를 확인하고 실제 사용자 공간에서 커널 통신이 어떻게 작동하는지 확인할 수 있습니까?
배경 참고 사항: 저는 모든 c 함수가 결국 /dev
.
답변1
시스템 호출그 자체개념이다. 이는 프로세스가 커널에 수행을 요청할 수 있는 작업을 나타냅니다.
이러한 시스템 호출은 UNIX 계열 시스템의 커널에서 구현됩니다. 이 구현(C로 작성되었으며 그 정도는 asm으로 작성됨)은 실제로 시스템에서 작업을 수행합니다.
그런 다음 프로세스는 인터페이스를 사용하여 시스템 호출을 수행하도록 시스템에 요청합니다. 이 인터페이스는 POSIX에 의해 지정됩니다. 이것은 C 표준 라이브러리의 함수 세트입니다. 실제로는 몇 가지 검사를 수행한 다음 커널에서 시스템별 기능을 호출하여 시스템 호출을 수행하기 위해 수행해야 할 작업을 알려주는 래퍼입니다. 비결은 인터페이스인 함수가 시스템 호출 자체와 동일한 이름을 가지며 종종 "시스템 호출"이라고 불리는 것입니다.
시스템별 메커니즘을 통해 시스템 호출을 수행하는 커널의 함수를 직접 호출할 수 있습니다. 문제는 코드를 완전히 이식할 수 없게 만든다는 것입니다.
따라서 시스템 호출은 다음과 같습니다.
- 사용자 프로세스에 서비스를 제공하기 위해 커널이 수행하는 일련의 작업인 개념
- 커널에서 이 서비스를 얻으려면 코드에서 C 표준 라이브러리 함수를 사용해야 합니다.
답변2
ㅏ시스템 호출프로그램 자체가 할 수 없는(또는 하기 불편한) 작업을 프로그램을 대신하여 운영 체제(커널)에 요청하는 방법입니다. 특정 작업을 수행할 수 없는 이유는 일반적으로 임의의 프로그램이 해당 작업을 수행하도록 허용하면 I/O 수행(RAM에 직접, 무엇이든 덮어쓰기)과 같은 시스템 무결성이 손상될 수 있기 때문입니다.
POSIX는 프로그램에 대한 인터페이스, 즉 프로그램이 호출할 수 있는 특정 기능을 정의합니다. 이들 중 일부는 시스템 호출로 직접적으로 변환되고 일부는 더 많은 정교함이 필요합니다. POSIX 인터페이스를 제공하고, 매개변수를 압축하고, 호출자에게 결과를 반환하는 것은 언어(예: C 라이브러리)의 런타임입니다.
Unixy 시스템은 시스템 호출 형태로 POSIX 인터페이스를 다소 직접적으로 제공합니다. 일반적으로 시스템 호출을 직접 호출하는 방법이 있습니다. syscall(2)
Linux에서 이 기능을 사용하는 방법에 대한 자세한 내용을 확인하세요.
답변3
물론, "이 코끼리를 얼마나 많은 방향으로 볼 수 있는가?"를 살펴보겠습니다.
빌드한 프로그램에서 실제 시스템 호출은 커널 모드로의 권한 상승을 트리거하는 기계 명령어인 반면, 커널 자체에서는 명령어가 호출하는 코드입니다. libc 코드(및 모든 언어 런타임)는 커널 코드가 찾을 것으로 예상되는 위치(기계 명령어 제한으로 인해 이상한 위치일 수 있음)에 기계 레지스터와 저장 매개변수를 설정합니다.
운영 체제 코드 자체에 들어가면 사용자 공간 런타임이 수행하는 특정 머신 관련 작업을 일부 미러링한 다음 완전히 일반적인 서브루틴 호출을 수행합니다.
전체 운영 체제에서 어떻게 작동하는지 정확히 보려면 커널 소스 코드( git clone https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
)를 추출하고 예를 들어 실행하십시오 git grep -i system\ call
. glibc 소스를 가져와 동일한 작업을 수행합니다.
답변4
모든 시스템 호출에는 연관된 정수가 있습니다. 이 정수는 시스템 호출의 반환 값, 시스템 호출에 대한 인수 수 및 인수 유형의 함수입니다. 이 시스템 호출 번호는 권한 있는 모드에서만 액세스할 수 있고 적절한 핸들러에 대한 포인터를 포함하는 전역 시스템 호출 벡터에 대한 오프셋에 지나지 않습니다. 시스템 호출을 호출하는 과정에서 소프트웨어 인터럽트(트랩 인터럽트)가 발생하므로 어떤 시스템 호출을 호출해야 하는지 결정하기 위해 트랩 핸들러가 실행됩니다. 그런 다음 커널은 사용자가 전달한 시스템 호출 매개변수를 프로세서 레지스터에 복사하고, 요청된 서비스를 완료한 후 프로세서 레지스터의 데이터를 다시 스택에 복사합니다. 이것이 시스템 호출 인수가 제한되는 이유 중 하나입니다. 인수는 역시 제한된 레지스터를 갖는 프로세서 레지스터에 복사되기 때문입니다.