시스템 호출 번호 → 런타임 이름 매핑

시스템 호출 번호 → 런타임 이름 매핑

관찰된 시스템 호출 수를 해결하는 방법이 있습니까?

SYS_345(0xe, 0xbff94188, 0x2, 0x4000, 0xb6526000) = 2

소스 코드에서 찾지 않고 실행 중인 커널의 기호 이름에 추가하시겠습니까?

편집하다사용 사례가 더 이상 사용되지 않음스트레스커널 소스 코드를 검색하는 것이 지루할 수 있는 외부 시스템의 바이너리입니다.

답변1

내가 아는 한, 실행 중인 커널에서 시스템 호출 번호와 시스템 호출 이름의 매핑을 결정하는 보장된 방법은 없습니다. 시스템 호출 번호에 해당하는 호출을 찾으려면 항상 소스 코드를 파헤쳐야 합니다...

이러한 매핑을 수행해야 하는 소프트웨어 개발자는 자신의 시스템 호출 목록을 유지하는 경향이 있습니다.strace. 이는 그러한 프로그램의 특정 버전이 특정 커널에 비해 오래되었을 가능성이 있음을 의미하지만 실제로 시스템 호출은 이것이 큰 문제가 되지 않을 정도로 천천히 추가됩니다.

커널 소스 코드에서 값을 찾는 것조차 아키텍처에 따라 매핑이 다른 방식으로 저장되기 때문에 복잡합니다. x86 및 그와 같은 "단순" 아키텍처를 매핑하는 경우에도시스템 호출 테이블, 특정 번호로 걸려온 전화를 찾으려면 여러 위치에서 여러 번 조회해야 할 수 있습니다.

시스템에 GCC 및 시스템 헤더 파일이 있는 한 시스템 매핑을 찾는 빠르고 안정적인 방법은 후자를 사용하는 것입니다. 예를 들어,

awk 'BEGIN { print "#include <sys/syscall.h>" } /p_syscall_meta/ { syscall = substr($NF, 19); printf "syscalls[SYS_%s] = \"%s\";\n", syscall, syscall }' /proc/kallsyms |
sort -u | gcc -E -P - | less

여기에서 Linux 시스템 호출 목록을 추출하고 /proc/kallsymsC 코드(또는 C 전처리기 코드)를 작성하여 전처리기에 공급하면 다음과 같은 결과가 생성됩니다.

syscalls[288] = "accept4";
syscalls[43] = "accept";
syscalls[21] = "access";
syscalls[163] = "acct";
syscalls[248] = "add_key";

등. 필요한 경우 GCC 플래그를 사용하여 커널과 일치하도록 아키텍처를 조정할 수 있습니다(예를 들어 -m32i386 시스템 호출 번호 또는 -mx32x86-32 번호를 확인하세요.

귀하의 경우 345는 i386의 시스템 호출 번호 sendmmsg이며 x86-64 또는 x86-32의 어떤 것과도 일치하지 않습니다. 이는 2011년 2.6.39 시기에 도입되었으므로 오랫동안 2.6.32를 커널 및 관련 프로그램의 기반으로 사용하는 시스템은 이에 대해 알지 못할 것입니다 strace. ) 및 최신 커널).

관련 정보