nolibc.h 하나의 헤더 파일로 구성되어 있으며, v5.1-rc1 이후 tools/include/nolibc/nolibc.h 에 위치해 있습니다.
최소한의 syscall 및 main()을 호출하는 데 필요한 최소한의 시작 코드로 구성됩니다.
우선 파일을 열 때 쓰는 open() 시스템 콜을 nolibc 에서는 어떻게 구현되어 있는지 살펴보겠습니다.
커널 관점에서는 open() 시스템 콜에 대응은 어떻게 구현되어 있는지 살펴보겠습니다.
해당 인터페이스로 노출이 되어있고, 커널 쪽 open()의 구현을 볼 수 있습니다.
아래에서 보이는 대로 vfs_open()으로 들어가게 됩니다. 쭉 들어가면 open 할 때에 타입 플래그에 대한 분기에 따라 dentry, inode을 활용하여 파일 시스템마다 VFS 에 등록한 컬백을 활용함을 볼 수 있습니다.
다시 nolibc.h 로 돌아와서 아키텍쳐 별로 어떻게 구현되어 있는지 arm64 와 risc-v 두 가지를 살펴보겠습니다.
각 ISA 에 해당하는 인스트럭션을 살펴볼까요~
nolibc 빌드는 이렇게 하면 됩니다.
참고:
메인테이너 레포지토리
http://git.formilux.org/?p=people/willy/nolibc.git
System Call 구성에 대한 주석과 설명이 포함된 커밋
https://lore.kernel.org/lkml/20181229180218.15798-4-w@1wt.eu/
v5.1-rc1 에서 tools/testing/selftests/rcutorture/bin/nolibc.h -> tools/include/nolibc/nolibc.h 로 디렉토리를 옮겼음
https://elixir.bootlin.com/linux/v5.1-rc1/source/tools/include/nolibc/nolibc.h
5.2-rc1 애서 RISC-V 아키텍쳐 지원을 추가함
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=019d7316ea84b7d8a8bcb9f2036aa4917a32986a
3.x 기준 syscall 위치 정리
https://syscalls.w3challs.com/
저는 glibc 구현 대신 musl 코드로 내부를 열어봤는데, 커널 내부에 이런 헤더가 있는 줄은 처음 알았습니다.
좋은 정보 감사합니다.