시스템 호출은 커널의 일부인가요, 아니면 운영 체제의 일부인가요?

시스템 호출은 커널의 일부인가요, 아니면 운영 체제의 일부인가요?

사용자가 시스템 호출을 실행하면 인터럽트가 발생하고 실행이 커널 모드로 전환된 후 시스템 호출 실행을 담당하는 인터럽트 핸들러가 실행됩니다. 이제 나는 이 인터럽트 핸들러(그리고 다른 모든 인터럽트 핸들러)가 커널의 일부라고 믿습니다.

하지만 시스템 호출 구현(예: 파일에 데이터를 쓰는 명령 또는 소켓을 여는 명령)은 어떻습니까? 이러한 명령어는 커널의 일부로 간주됩니까, 아니면 운영 체제의 일부이지만 외부에 있습니까? 핵심?

답변1

시스템 호출을 구현하는 방법에는 여러 가지가 있으며, "소프트웨어 인터럽트"(트랩)가 그 중 하나이고 사용되어 왔으며 여전히 사용되고 있지만 명령과 같은 다른 방법도 있습니다 syscall(예:여기상세 사항은).

따라서 시스템 호출은 커널 코드를 호출하는 방법입니다. 호출되는 코드는 커널의 일부여야 합니다. 호출 코드는 사용자 공간에 있으며(분명히) 일반적으로 라이브러리의 일부입니다(예: libc).

"X는 Y의 일부입니다"라는 질문은 주로 Y에 대한 정의에 따라 달라집니다. "커널", "운영 체제" 및 "~의 일부"가 무엇을 의미하는지 정의하면(사람마다 다른 방식으로 정의) "시스템 호출은 커널 또는 운영 체제의 일부입니다"라고 말할 수 있습니다.

이에 대해 생각하는 더 좋은 방법은 시스템 호출이 커널 코드에 대한 API(응용 프로그래밍 인터페이스)를 정의한다는 것입니다. 따라서 커널(경우에 따라 특정 버전의 커널)과 긴밀하게 결합됩니다.

답변2

하지만 시스템 호출(예: 파일에 데이터를 쓰는 명령 또는 소켓을 여는 명령)의 구현은 어떻습니까? 이러한 명령어는 커널의 일부로 간주됩니까?

그것들은 커널의 일부입니다.

하지만 이 주장을 뒷받침하려면 몇 가지 참고 자료가 필요할 수도 있을 것 같습니다.

시스템 호출의 소스 코드 read()는 다음과 같습니다.linux-5.0/fs/read_write.c:571

분명히 특정 파일 시스템에서 읽은 소스 코드를 찾으려면 많은 함수 호출을 추적해야 합니다. :-).

이 코드는 모두 커널 이미지에 내장되어 있거나 필요에 따라 로드되어 실행 중인 커널의 일부가 될 수 있는 모듈에 내장되어 있습니다. Linux는 다양한 파일 시스템 유형을 지원하므로 모듈로 구축되는 경우가 많습니다.

ext4파일 시스템을 사용 중일 수 있습니다 vfat. 를 사용하여 로드된 커널 모듈 목록을 볼 수 있습니다 lsmod.

내 Fedora 29 시스템에서는 ext4커널 이미지의 일부이지만 vfat로드 가능한 모듈입니다. 따라서 lsmod표시되지 않습니다 ext4. 하지만 modprobe --show-depends ext4"ext4 내장"이라고 알려줍니다.

매뉴얼 페이지:

관련 정보