>source

Go에서 이름 /번호로 amd64 및 i386에 대한 Linux 시스템 호출을 조회하고 싶습니다. Go 표준 라이브러리 또는 타사 모듈에서 사용할 수있는 내장 매핑이 있는지 궁금합니다.

여기서 Go 개발자가 Linux syscall 번호를 syscall 모듈에 하드 코딩 한 것을 볼 수 있습니다.

GCC를 사용하여 다음 파일을 각각 생성 한 것 같습니다.

https://golang.org/src/syscall/mksysnum_linux.pl
//mksysnum_linux.pl /usr/include/asm/unistd_32.h
//Code generated by the command above; DO NOT EDIT.
//+build 386,linux
package syscall
const (
    SYS_RESTART_SYSCALL      = 0
    SYS_EXIT                 = 1
    SYS_FORK                 = 2
    SYS_READ                 = 3
    SYS_WRITE                = 4
    SYS_OPEN                 = 5
    SYS_CLOSE                = 6
...

내 code 내에서이 매핑을 하드 코딩하는 것이 최선의 방법일까요, 아니면 어딘가에 유지 관리 된 매핑이 있습니까? 시스템 콜 번호가 변경 될 수 있음을 이해하지만 이는 최선의 노력입니다.


  • 답변 # 1

    매핑은 커널 소스에 있습니다. 예를 들어 한 아키텍처의 매핑은/usr/include/asm/unistd_32.h

    파일을 파싱하는 perl 스크립트와 나란히 읽어야합니다 (스크립트는 페이지 길이에 불과하며 매우 적은 수의#밝히다헤더 파일의 패턴 ... 일부 패턴은 연속으로 여러 번 일치하여 이름과 번호로 전체 시스템 호출 목록을 찾습니다.)

    또한 다음 질문을 참조하십시오 (교차 사이트 복제).

    내 질문을 편집 할 것입니다-특정 엔드 포인트에서 syscall 이름 /번호 간의 매핑을 찾고 있지 않습니다. amd64 /i386의 모든 Linux 시스템에서 syscall 이름 /번호 간의 매핑을 찾고 있습니다. syscall 이름 /번호로 감사 이벤트를 필터링하는 데 사용됩니다.

    bp256r12021-02-23 01:16:07

    @ bp256r1 : amd64와 i386의 숫자가 다르다는 것을 알고 있습니까? 연결된 질문과 답변과 내가 연결 한 다른 하나를 읽으십시오. 이러한 매핑은 특정 아키텍처에 대해 매우 안정적입니다.이 엔드 포인트와 특정 커널 버전에 대해 걱정할 필요가 없습니다. 새로운 시스템 호출이 발생하기 때문에 어떤 아키텍처를 알아야하며 최신 커널 소스에 대한 조회를 수행해야합니다. 수시로 추가됩니다.

    Ben Voigt2021-02-23 01:16:07

    예, syscall 번호는 주어진 아키텍처에서만 안정적이라는 것을 알고 있습니다-원래 질문에서 두 개의 다른 테이블에 연결했습니다-syscall 번호가 커널에서 커널로 변경 될 수 있다고 생각했습니다 (예 : Oracle이 자체 시스템 호출 또는 ).

    bp256r12021-02-23 01:16:07

    @ bp256r1 : 이론적으로 모든 커널 버전에서 syscall 번호가 다를 수 있습니다. 그러나 이것이 발생하는 것은 매우 비실용적이므로 시스템 호출을 추가하는 사람은 미리 계획하고 변경할 필요가없는 번호를 사용하는 데주의를 기울이거나 ... 음, 시스템 호출을 피해야합니다. :-) (그들이 그것을 엉망으로 만들면, 또 무엇이 잘못 되었습니까?)

    torek2021-02-23 01:16:07
  • 이전 c# : 조건별로 다른 클래스를 만드는 방법은 무엇입니까?
  • 다음 c# : C # 매개 변수를 사용하여 기본 클래스에서 연산자를 호출하는 방법