>시스템 튜토리얼 >리눅스 >Syscall 시스템 호출 Linux 커널 추적

Syscall 시스템 호출 Linux 커널 추적

WBOY
WBOY앞으로
2024-02-12 21:21:14434검색

Linux 사용자 공간에서는 시스템 호출을 호출해야 하는 경우가 많습니다. 읽기 시스템 호출의 구현을 추적하기 위해 Linux 버전 2.6.37을 예로 들어 보겠습니다. 시스템 호출 구현은 Linux 버전에 따라 다를 수 있습니다.

Syscall 시스템 호출 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에서 언급한 매크로 정의와 유사합니다.

즉, 매크로 정의의 다음 코드는 다음과 같습니다.

으아악

코드 분석:

  • fget_light(): fd에 지정된 인덱스에 따라 현재 프로세스 설명자에서 해당 파일 객체를 검색합니다(그림 3 참조).
  • 지정된 파일 객체를 찾을 수 없으면 오류가 반환됩니다
  • 지정된 파일 객체가 발견된 경우:
  • 이번에 읽고 쓴 파일의 현재 위치를 얻으려면 file_pos_read() 함수를 호출하세요.
  • 파일 읽기 작업을 수행하기 위해 vfs_read()를 호출하고, 이 함수는 궁극적으로 file->f_op.read()가 가리키는 함수를 호출합니다.

if (파일->f_op->읽기)
ret = 파일->f_op->읽기(파일, buf, 개수, pos);

  • file_pos_write()를 호출하여 파일의 현재 읽기 및 쓰기 위치를 업데이트합니다.
  • 파일의 참조 횟수를 업데이트하려면 fput_light()를 호출하세요.
  • 마지막으로 읽은 데이터의 바이트 수가 반환됩니다.

이 시점에서 가상 파일 시스템 계층의 처리가 완료되고 제어권이 ext2 파일 시스템 계층으로 넘어갑니다.

위 내용은 Syscall 시스템 호출 Linux 커널 추적의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제