리눅스 시스템 콜 테이블 사이트 syscall.sh 갱신, 27개 아키텍처와 JSON API 공개
- 27개 아키텍처의 시스템 콜 테이블을 한곳에 모아 번호, 인자, 레지스터를 정리했고 x64 369개, ppc 425개, x86 441개, sh 433개처럼 아키텍처별 개수와 최초 등장 커널 버전을 함께 표시함
- 각 아키텍처 페이지에 커널 버전 선택기가 있고 //syscalls.json으로 전체 이력을 받을 수 있으며, 항목마다 처음 등장한 릴리스(since)와 제거된 릴리스(removed_in)를 기록해 제거된 syscall도 'all, with removed'에서 계속 볼 수 있음
- 데이터는 커널 소스에서 JSON으로 생성해 API가 로드하고 프론트엔드는 주간 크론의 Go 템플릿이 갱신하는 구조이며, 이전에는 수동 실행 스크립트와 SQL 변환 탓에 여러 해 동안 낡은 상태였음
- api.syscall.sh는 curl https://api.syscall.sh/v2/syscalls/x64/read 형태로 단일 콜을 조회하고 릴리스 간 diff와 임의 커널 릴리스 정보를 제공함
- 댓글에서 x86_64와 x32의 syscall 번호는 rax가 아니라 eax에 들어가고 rax 상위 32비트는 무시된다는 지적이 나왔고, 작성자는 5.14 이후 커널이 eax만 읽는다며 x64와 x32 문서에 노트를 추가한다고 답함
Hacker News 의견들
read랑 readv, pread, sendmsg랑 sendmsgv, fork랑 vfork처럼 비슷한 것들도 굳이 따로 분류하는 게 맞나 싶음. 번호가 다르면 다른 syscall인 건가?
세부 페이지에 '이 아키텍처의 비슷한 syscall' 섹션 하나 넣어주면 진짜 좋겠음.
비슷하다고 보긴 어려움. 미묘한 의미 차이가 다 있음. 구분 기준은 작성자 페이지가 아니라 syscall.tbl이고, 번호가 다르니 각각 항목을 가져야 맞음. deprecated 된 건 pipe 대신 pipe2 쓰라는 경고 배너라도 있으면 좋겠음.
x86_64랑 x32는 syscall 번호가 rax가 아니라 eax에 들어감. rax 상위 32비트는 무시되고 아무 값이나 돼도 됨.
지적 고마움. 5.14부터 커널이 eax만 읽는 걸로 알고 있어서 x64, x32 문서에 노트 추가하는 중임.
aarch64 어셈블리 배우는 중인데 이런 자료가 있는 줄 몰랐음. 진짜 유용함.
궁금한 게 있는데 리눅스 API가 같으면 왜 아키텍처마다 syscall이 다른 거임? POSIX랑 헷갈리는 건가?
커널 API는 어디서나 같고, 번호와 호출 규약 같은 syscall ABI는 아키텍처별로 다름. 그 세부를 C 라이브러리가 POSIX로 감싸주는 거임.
사이트 처음 낼 때 syscall API 조회용 CLI도 만들었는데, 내장 데이터셋을 써서 매번 API를 때리지 않아도 됨. 코드 정리해서 공개할까 함.
이거 어떻게 만드는 거고 얼마나 자주 낡음?
예전엔 수동 스크립트라 몇 년 동안 방치돼 있었음. 지금은 커널 소스에서 JSON으로 뽑고 API가 그걸 로드하며, 프론트엔드는 주간 크론이 Go 템플릿으로 갱신함.
사이트가 내 그래픽을 왜인지 망가뜨림.
echo '#include <sys/syscall.h>' | gcc -E -dM -xc - | grep -i read 같은 명령으로 자기 PC의 실제 값을 확인하는 게 좋음. LLM이 syscall 번호나 상수를 틀리게 준 적이 여러 번이라 직접 보는 게 확실함. 크로미움 문서에도 표가 있음.
사이트 내용은 커널 소스에서 바로 오니까 정확함. 크로미움 페이지는 2020년에 이 사이트 만들기 전까지 쓰던 건데 꽤 낡았음.
듀얼 Pentium III 레트로 빌드 중인데 32비트라 SSE2 같은 게 없음. Haiku, ReactOS, NetBSD, antiX, MX Linux 생각 중인데 다른 OS 추천 있음?
SerenityOS도 한번 넣어봐.