Linux에서 시스템 호출은 사용자 프로그램이 호출할 수 있도록 운영 체제에서 제공하는 특수 인터페이스 집합을 의미합니다. 사용자 프로그램은 이 인터페이스 집합에 따라 운영 체제 커널에서 서비스를 얻을 수 있으며 특정 위치를 지정합니다. 사용자 프로세스가 커널에 빠지거나, 사용자가 커널에 접근할 수 있는 경로가 계획되어 있고, 커널은 고정된 위치에서만 들어갈 수 있다고 합니다.
이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.
1. 시스템 호출이란 무엇입니까
시스템 호출은 사용자 프로그램이 호출할 수 있도록 운영 체제에서 제공하는 특수 인터페이스 집합을 말합니다. 이 인터페이스 서비스 세트를 기반으로 합니다. 사용자 프로세스가 커널에 속하는 구체적인 위치를 규정하거나, 사용자가 커널에 접근할 수 있는 경로를 계획하고, 고정된 위치에서만 커널에 진입할 수 있도록 해준다.
2. Linux 시스템 호출
최신 운영 체제의 경우 시스템 호출은 사용자 공간과 커널 간의 일반적인 통신 수단이며 Linux도 예외는 아닙니다. Linux 시스템 호출은 기능 영역에 따라 크게 프로세스 제어, 파일 액세스, 시스템 제어, 저장소 관리, 네트워크 관리, 프로세스 통신 등으로 구분됩니다. 자세한 설명은 man 2 syscalls 명령을 통해 맨페이지 설명을 볼 수 있습니다.
시스템 호출은 소프트 인터럽트 메커니즘을 통해서만 커널에 요청을 제출하고 시스템 호출의 해당 서비스에 들어갑니다. Linux에서 제공하는 사용자 프로그래밍 인터페이스는 POSIX 표준을 따르며 일부 표준 C 함수를 정의하는 것 외에도 사용자 프로그래밍을 위한 시스템 호출을 캡슐화하는 캡슐화 루틴 세트도 제공합니다. 그러나 캡슐화는 필요하지 않습니다. 직접 호출하려는 경우 Linux 커널은 호출을 구현하는 syscall() 함수도 제공합니다. 다음 예제를 통해 C 라이브러리 호출과 직접 호출의 차이점을 알아보세요.
/* ** file: demo.c ** author: eric.xu ** date: 2016-02-25 */ #include <syscall.h> #include <unistd.h> #include <sys/types.h> #include <stdio.h> int main(void) { long id1, id2; /* system call no 20, __NR_getpid equal to SYS_getpid */ id1 = syscall(__NR_getpid); printf("sys_call getpid %ldn", id1); /* libc getpid */ id2 = getpid(); printf("libc getpid %ldn", id2); return 0; }
컴파일하고 실행해 보면 결과가 일관된 것을 확인할 수 있습니다.
sys_call getpid 2899 libc getpid 2899
3. Linux 시스템 호출 구현
사용자 모드 프로세스가 시스템 호출을 호출하면 CPU는 커널 모드로 전환되고 커널 기능 실행을 시작합니다. 커널의 각 시스템 호출에는 고유한 레이블이 있으므로 사용자 모드 호출은 특정 시스템 호출 기능을 결정하기 위해 시스템 호출 번호 매개변수를 전달해야 합니다. 모든 시스템 호출 함수는 정수입니다. 커널에서 정수와 0은 시스템 호출이 성공적으로 종료되었음을 나타내고, 음수는 오류 조건을 나타냅니다. 이 오류 값은 errno 변수에 저장되어 오류 코드로 응용 프로그램에 반환됩니다.
Linux 시스템 호출은 소프트 인터럽트를 사용하여 구현됩니다. x86 아키텍처에서는 int $0x80 어셈블리 명령어가 호출되며 벡터는 128입니다. arm 아키텍처에서 SWI 명령어는 커널 공간에 들어가는 데 사용됩니다. 이 명령어의 형식을 살펴보겠습니다.
SWI {cond} immed24;其中immed24表示24位立即数
SWI 예외 인터럽트 핸들러는 오류를 발생시킨 SWI 명령어를 읽어 24비트 즉시 숫자를 가져와야 합니다. 소프트웨어 인터럽트. 기본 단계는 SWI 예외가 발생한 후 명령어가 ARM 명령어인지 아니면 Thumb 명령어인지 확인하기 위해 SPSR 레지스터에 액세스한 다음 LR 레지스터에 액세스하여 전체 명령어 주소를 얻은 다음 명령어를 얻고 가장 낮은 명령어를 얻는 것입니다. 24비트 즉시 데이터.
관련 추천: "Linux 비디오 튜토리얼"
위 내용은 리눅스에서 시스템 호출이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!