- 개인 휴식용 프로젝트로 시작한 Bunnix는 x86_64 대상 Unix 계열 운영체제를 약 한 달 안에 어디까지 만들 수 있는지 실험했고, 실제 작업일 기준 27일이 걸림
- 커널은 주로 Hare로 작성됐으며, ext4 지원용 lwext4와 커널 비디오 터미널용 libvterm 같은 C 구성요소를 함께 사용함
- legacy boot와 EFI를 모두 지원하고 일부 실제 노트북에서 테스트됐지만, USB 미지원 때문에 PS/2 키보드나 BIOS의 PS/2 에뮬레이션이 필요함
- 사용자 공간은 dash, Doom, gzip, less, mandoc, sbase, tcc, Vim 5.7 등 서드파티 소프트웨어 중심이며, libc는 musl libc를 Bunnix에 맞게 수정한 형태임
- Bunnix는 동작하지만 버그가 많고 단일 사용자 시스템에 머물러 있으며, 장기 유지보다는 Helios 재작업과 커널 설계 개선으로 이어지는 실험에 가까움
Bunnix의 범위와 실행
- Bunnix는 2024년 4월 21일 시작된 x86_64 대상 Unix 계열 운영체제 프로젝트임
- 실제로 작업하지 않은 날을 제외하면 총 27일이 투입됨
- 직접 실행할 수 있는 Bunnix 0.0.0 iso가 제공됨
- qemu에서는 다음 명령으로 ISO를 부팅할 수 있음
qemu-system-x86_64 -cdrom bunnix.iso -display sdl -serial stdio
- ISO를 USB 스틱에 기록해 실제 하드웨어에서도 부팅할 수 있음
- 대부분의 AMD64 머신에서 동작할 가능성이 있음
- ThinkPad X220과 Starlabs Starbook Mk IV에서 테스트됨
- legacy boot와 EFI를 모두 지원함
- 가장 큰 실행 제약은 USB 미지원임
- PS/2 키보드 또는 BIOS의 PS/2 에뮬레이션이 필요함
- 대부분의 노트북 키보드는 PS/2 방식으로 연결됨
- USB 키보드의 PS/2 에뮬레이션 동작 여부는 환경에 따라 다름
- Doom 포트는 키 바인딩과 종료 동작에 제약이 있음
- WASD로 이동
- 오른쪽 Shift로 발사
- Space로 문 열기
- 게임 종료가 동작하지 않아 플레이 후 재부팅해야 함
커널 구조와 지원 기능
- Bunnix 커널은 대부분 Hare로 작성됐고, 일부 C 구성요소를 함께 사용함
- ext4 파일시스템 지원에는 lwext4 사용
- 커널 비디오 터미널에는 libvterm 사용
- 지원 드라이버는 기본 하드웨어와 저장장치 부팅에 필요한 범위에 집중됨
- PCI legacy
- AHCI 블록 장치
- GPT 및 MBR 파티션 테이블
- PS/2 키보드
- 플랫폼 직렬 포트
- CMOS 클록
- 부트로더가 설정한 프레임버퍼
- ext4 및 memfs 파일시스템
- Unix 계열 시스템에 필요한 기본 커널 기능도 포함함
-
가상 파일시스템과 장치
- 블록 장치, null, zero, full 의사 장치,
/dev/kbd, /dev/fb0, 직렬 및 비디오 TTY, /dev/tty 제어 터미널을 갖춘 /dev를 제공함
- 비교적 완성된 터미널 에뮬레이터와 어느 정도 동작하는 termios 지원이 들어감
-
시스템 호출과 사용자 모델
clock_gettime, poll, openat, fork, exec, pipe, dup, dup2, ioctl 등을 포함한 약 40개 시스템 호출을 지원함
- 현재 Bunnix는 단일 사용자 시스템임
- Unix 파일 모드와 소유권을 강제하지 않음
- 며칠 더 작업하면 다중 사용자 시스템으로 만들 수 있는 상태임
부트로더와 사용자 공간
- Bunnix에는 두 개의 부트로더가 포함됨
- legacy boot용 부트로더는 multiboot 호환이며 Hare로 작성됨
- EFI용 부트로더는 C로 작성됨
- 두 부트로더는 필요할 경우 커널을 ELF 파일과 initramfs로 로드함
- EFI 부트로더는 initramfs 압축 해제를 위해 zlib를 포함함
- multiboot 호환 부트로더는 압축 해제를 대신 처리함
- 사용자 공간은 대부분 서드파티 소스로 구성됨
- Colossal Cave Adventure
advent
dash /bin/sh
- Doom
- gzip
- less
lok /bin/awk
- lolcat
- mandoc
- sbase core utils
- tcc C 컴파일러
- Vim 5.7
- libc는 musl libc에서 파생됐고 Bunnix 요구에 맞게 여러 수정이 들어감
- curses 라이브러리는 netbsd-curses 기반임
- 시스템은 동작하지만 버그가 많고 일부 구현이 급하게 만들어져, 충돌에 대비해야 함
빠른 구현을 가능하게 한 요소와 난점
- 일부 Bunnix 코드는 이전 프로젝트 Helios에서 왔음
- GDT, IDT 같은 일반적인 CPU 설정 관련 커널 코드 일부가 포함됨
- AHCI 같은 일부 드라이버도 Bunnix 시스템에 맞게 조정됨
- Helios 경험이 없었다면 Bunnix를 이렇게 빠르게 만들기 어려웠을 것으로 봄
- ext4 지원과 가상 터미널 통합이 특히 어려웠음
- lwext4와 libvterm이라는 외부 의존성을 가져옴
- 파일시스템 계층은 몇 차례 다시 작성됐고 현재도 버그가 남아 있음
openat과 inode 처리를 포함한 Unix 파일시스템 설계를 제대로 구현하려면 lwext4 내부를 더 들여다봐야 했음
- Hare 프로젝트 안에서 Hare, 어셈블리, C 소스를 함께 링크하는 경험도 얻음
- 전반적으로 잘 동작했지만 ABI 통합 장치를 만드는 부분에서 불편함이 있었음
- C 헤더를 Hare forward declaration 모듈로 자동 변환하면 좋겠다는 필요가 생김
- 관련 작업은
hare-c에 일부 존재하지만 아직 더 필요함
- Vim 포트를 목표로 하면서 터미널 구현의 난도가 커짐
- libvterm은 좋은 터미널 상태 머신 라이브러리지만 문서가 부족함
- 정확한 통합을 위해 많은 미세 조정이 필요했음
- 부드럽게 동작하도록 성능 최적화에도 시간을 썼음
- 스케줄러는 Helios 기반 코드를 상당 부분 버리고 다시 작성한 영역임
- Helios와 Bunnix는 모두 단일 CPU 시스템임
- Bunnix는 Helios와 달리 커널 안에서 컨텍스트 전환을 허용함
- 선점형 작업 전환도 커널을 통해 들어오고 나감
- 이 구조에는 여러 커널 스택과 다른 작업 전환 방식이 필요함
- 충분히 견고한 스케줄러가 있으면 디스크 읽기나
pipe(2) 같은 블로킹 작업을 wait queue로 단순하게 구현할 수 있음
- 시그널 구현은 Unix 호환을 위해 필요했음
- Helios는 Unix를 목표로 하지 않아 시그널 없이도 동작함
- Bunnix에서는 dash 포트를 위해
SIGCHLD가 제대로 동작하도록 주로 맞춤
- 최종 시그널 구현은 매우 기본적인 수준임
Helios로 이어지는 설계 교훈
- Bunnix는 모놀리식 커널이고 Helios는 Unix가 아닌 마이크로커널 설계임
- 파일시스템에서는 캐싱의 중요성을 확인함
- Helios는 파일시스템 구현을 여러 드라이버와 별도 프로세스에 나눠 둠
- 살아 있는 객체 추적만을 위해서라도 파일시스템 계층의 캐싱이 중요함
- Helios 재작업 시 파일시스템 코드를 리팩터링하거나 다시 작성할 작업이 많아짐
- 드라이버 접근은 모놀리식 커널에서 자연스럽게 더 단순함
- 다만 ring 0에 많은 것을 넣은 점에는 완전히 만족하지 않음
- Helios 스케줄러에 모놀리식 설계의 제어 흐름 요소를 일부 반영할 여지가 있음
- 메모리 관리에서는 비트맵 할당자가 예상보다 잘 동작함
- Helios에서는 비트맵 할당자를 피하려 했고 메모리 관리가 큰 불편 지점이었음
- Bunnix는 시스템의 일반 페이지 전체에 단순 비트맵 할당자를 사용함
- 우려했던 것보다 오버헤드가 크지 않았고 매우 잘 동작함
- 30일 안에 Bunnix를 만든 것은 마이크로커널 설계로는 불가능했을 것으로 봄
- 모놀리식 커널은 구현이 훨씬 단순함
- 마이크로커널 설계의 장점도 매력적이며, 더 나은 답은 하이브리드 커널일 수 있음
프로젝트 상태와 남은 개선 후보
- Bunnix는 앞으로 많은 시간을 더 들일 대상이라기보다 거의 완성된 아트 프로젝트에 가까움
- 이후 OS 개발은 Bunnix에서 얻은 교훈을 바탕으로 Helios에 돌아가 주요 재설계를 진행하는 쪽임
- 개선 우선순위 후보는 다음과 같음
- 파일시스템용 디렉터리 캐시와 전반적인 캐싱 개선
- ext4 버그 수정
- procfs와 top
- 파일 mmap
SIGSEGV 같은 추가 시그널
- 다중 사용자 지원
- NVMe 블록 장치
- IDE 블록 장치
- ATAPI와 ISO 9660 지원
- Intel HD audio 지원
- 네트워크 스택
- 기본 시스템의 Hare 툴체인
- 셀프 호스팅