Paran Lee
nolibc 최소한 구현으로 glibc 대체! 시스템 콜 정의도 엿보자
최종 수정일: 2021년 12월 19일

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/