Linux 사용자 공간에서는 시스템 호출을 호출해야 하는 경우가 많습니다. 읽기 시스템 호출의 구현을 추적하기 위해 Linux 버전 2.6.37을 예로 들어 보겠습니다. 시스템 호출 구현은 Linux 버전에 따라 다를 수 있습니다.
일부 애플리케이션에서는 다음과 같은 정의를 볼 수 있습니다.
으아악실제로 실제로 호출되는 것은 시스템 함수 syscall(SYS_read), 즉 sys_read() 함수입니다. Linux 버전 2.6.37에서 이 기능은 여러 매크로 정의를 통해 구현됩니다.
Linux 시스템 호출(SCI, 시스템 호출 인터페이스)은 실제로 다중 채널 집계 및 분해 프로세스입니다. 집계 지점은 0x80 인터럽트 진입 지점(X86 시스템 구조)입니다. 즉, 모든 시스템 호출은 사용자 공간에서 0x80 인터럽트 지점까지 집계되며 동시에 특정 시스템 호출 번호가 저장됩니다. 0x80 인터럽트 핸들러가 실행 중일 때 시스템 호출 번호에 따라 다른 시스템 호출이 별도로 처리됩니다. 즉, 처리를 위해 다른 커널 기능이 호출됩니다.
시스템 호출을 발생시키는 방법에는 두 가지가 있습니다:
(1) int $0×80, 이는 이전 Linux 커널 버전에서 시스템 호출을 발생시키는 유일한 방법이었습니다.
(2) 시스템센터 조립 지침
Linux 커널에서는 다음 매크로 정의를 사용하여 시스템 호출을 수행할 수 있습니다.
으아악SYSCALL_DEFINE3의 매크로 정의는 다음과 같습니다.
으아악##은 매크로의 문자를 직접 바꾸는 것을 의미합니다.
name = read이면 매크로에서 __NR_##name이 __NR_read로 대체됩니다. NR##name은 시스템 호출 번호이고, ##은 두 개의 매크로 확장을 나타냅니다. 즉, "name"을 실제 시스템 호출 이름으로 바꾼 다음 __NR을 확장합니다.... 이름 == ioctl인 경우 __NR_ioctl입니다.
CONFIG_FTRACE_SYSCALLS 매크로가 정의되었는지 여부에 관계없이 다음 매크로 정의가 결국 실행됩니다.
__SYSCALL_DEFINEx(x, sname, VA_ARGS)
으아악다음 유형의 매크로 정의가 최종적으로 호출됩니다.
asmlinkage 긴 sys##name(__SC_DECL##x(VA_ARGS))
이것이 앞서 언급한 sys_read() 시스템 함수입니다.
asmlinkage는 컴파일러에게 스택에서 함수의 인수만 추출하도록 지시합니다. 모든 시스템 호출에는 이 한정자가 필요합니다! 이는 이전 기사 quagga에서 언급한 매크로 정의와 유사합니다.
즉, 매크로 정의의 다음 코드는 다음과 같습니다.
으아악코드 분석:
if (파일->f_op->읽기)
ret = 파일->f_op->읽기(파일, buf, 개수, pos);
이 시점에서 가상 파일 시스템 계층의 처리가 완료되고 제어권이 ext2 파일 시스템 계층으로 넘어갑니다.
위 내용은 Syscall 시스템 호출 Linux 커널 추적의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!