top of page
작성자 사진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/


조회수 174회댓글 2개

관련 게시물

전체 보기

2 Comments


jsyoo5b
Mar 03, 2022

저는 glibc 구현 대신 musl 코드로 내부를 열어봤는데, 커널 내부에 이런 헤더가 있는 줄은 처음 알았습니다.


좋은 정보 감사합니다.

Like
Paran Lee
Paran Lee
Mar 03, 2022
Replying to

처음에 추가했던 메일링 리스트의 히스토리를 보면 더 재미있어요! ㅎㅎ

또 흥미로운 점은 malloc 이 없기 때문에 동적 메모리 할당을 직접 구현해야되요. 속도를 위한 캐시를 구현해볼까요? 파편화에 집중할까요? 둘 다는.. 쉽지 않겠네요!

Like
bottom of page