- Banan-OS는 C++로 작성된 취미 운영 체제이며, 현재 x86_64와 i686 아키텍처를 지원함
- 기능 범위는 Ring3 사용자 공간, SMP, 네트워크 스택, ELF 로딩·동적 링크, copy-on-write 메모리, 기본 그래픽 환경까지 포함함
- 드라이버와 시스템 기능은 NVMe·ATA 디스크, E1000/E1000E 및 RTL 계열 NIC, PS2·USB 입력, Ext2·FAT 파일시스템, GRUB 및 자체 BIOS 부트로더를 지원함
- TCP는 부분 구현이며 버그가 있음으로 표시되어 있고, SSL, virtio 장치, 일부 USB 컨트롤러, Sys·9P 파일시스템, 자체 UEFI 부트로더는 아직 미구현임
- 빌드는
./bos스크립트 중심으로 진행되며, 툴체인 생성 후 QEMU·Bochs 실행, 커널·이미지 빌드, 아키텍처·부트로더·UEFI·initrd 옵션 선택이 가능함
Banan-OS 개요
- Banan-OS는 C++로 작성된 취미 운영 체제임
- 현재 지원 아키텍처는 x86_64와 i686임
- 라이브 데모는 bananymous.com/banan-os에서 제공됨
- DOOM을 실행하려면
start-gui명령으로 GUI 환경에 들어간 뒤 GUI 터미널에서doom을 실행해야 함
구현된 주요 기능
- 일반 기능
-
Ring3 사용자 공간
- SMP, 즉 멀티프로세싱
- VESA와 GOP 기반 선형 프레임버퍼
- 네트워크 스택
- ELF 실행 파일 로딩
- 부분적인 AML 인터프리터
- 기본 그래픽 환경
- 터미널 에뮬레이터
- 상태 표시줄
- 프로그램 런처
- “괜찮은 앱”은 아직 미구현
- ELF 동적 링크
- copy-on-write 메모리
- 파일 매핑은 구현됨
- 익명 매핑은 미구현
-
드라이버·네트워크·파일시스템 지원
- 드라이버
- NVMe 디스크와 ATA IDE/SATA 디스크를 지원함
- E1000, E1000E, RTL8111/8168/8211/8411 NIC를 지원함
- PS2 키보드는 모든 scancode set을 지원하고, PS2 마우스도 지원함
- USB는 xHCI, 키보드, 마우스, 대용량 저장장치, 허브를 지원함
- EHCI, OHCI, UHCI, virtio 네트워크·스토리지 장치는 미구현
- 네트워크
- ARP, ICMP, IPv4, UDP를 지원함
-
TCP는 부분 구현이며 버그가 있음
- Unix domain socket을 지원함
- SSL은 미구현
- 파일시스템
- 가상 파일시스템, Ext2, FAT12/16/32, Dev, Ram, Proc를 지원함
- Sys와 9P는 미구현
- 부트로더
- GRUB와 자체 BIOS 부트로더를 지원함
- 자체 UEFI 부트로더는 아직 미구현
코드 구조
- 각 주요 컴포넌트와 라이브러리는
kernel,userspace,libc같은 별도 하위 디렉터리를 가짐 - 각 디렉터리에는 컴포넌트의 모든 헤더 파일을 담는
include디렉터리가 있음 - 모든 헤더는 절대 경로로 include됨
빌드와 실행
- Ubuntu 22.04 기준
apt패키지로build-essential,git,ninja-build,texinfo,bison,flex,libgmp-dev,libmpfr-dev,libmpc-dev,parted,qemu-system-x86,cpu-checker가 필요함 pacman환경에서는base-devel,git,wget,cmake,ninja,parted,qemu-system-x86가 필요함- 운영 체제용 툴체인은 한 번만
./bos toolchain으로 빌드함- binutils와 gcc를 컴파일하므로 시간이 오래 걸릴 수 있음
- OS 자체 빌드와 실행은
./bos명령으로 수행함./bos qemu./bos qemu-nographic./bos qemu-debug./bos bochs
- 커널이나 디스크 이미지만 빌드할 수도 있음
./bos kernel./bos image
- 디스크 이미지 생성·수정에는 root 권한이 필요함
빌드 옵션과 이미지 관리
- 다른 아키텍처로 빌드하려면
BANAN_ARCH환경 변수를 설정함- 예:
BANAN_ARCH=i686
- 예:
- 부트로더를 바꾸려면
BANAN_BOOTLOADER환경 변수를 설정함- 지원 값은
BANAN과GRUB
- 지원 값은
- UEFI로 실행하려면
BANAN_UEFI_BOOT=1을 설정해야 함OVMF_PATH도 올바른 OVMF 경로로 설정해야 하며, 기본값은/usr/share/ovmf/x64/OVMF.fd
- 물리 root 파일시스템 없이 initrd 이미지를 만들려면
BANAN_INITRD=1을 설정함- 지원되지 않는 USB 컨트롤러가 있는 하드웨어에서 테스트할 때 사용할 수 있음
- 디스크 이미지가 손상됐거나 새 이미지를 만들고 싶으면
build/banan-os.img를 삭제하거나./bos image-full을 실행함 - zsh용 shell completion 스크립트도 제공됨
_script/shell-completion/zsh/_bos파일을/usr/share/zsh/site-functions/로 복사하거나,_script/shell-completion/zsh를.zshrc의fpath에 추가함
기여 방식
- 업스트림은 GitHub가 아니라
https://git.bananymous.com/Bananymous/banan-os에 호스팅됨 - GitHub PR도 보낼 수 있지만, maintainer가 diff를 내려받아 수동 적용해야 함
- 별도 git 서버 계정을 받을 수도 있으며, 이 경우 이메일이나 Discord로 연락해야 함
- 새 기능 추가는 먼저 maintainer에게 연락하는 방식이 선호됨
- 학습 목적의 프로젝트라서, maintainer가 직접 하려던 기능을 사전 문의 없이 PR로 보내면 닫힐 수 있음
- 버그 수정은 항상 환영됨
- 커밋 메시지는 첫 줄을
Subject: Description형식으로 작성해야 함Subject는Kernel,Shell,BuildSystem처럼 변경 영역을 나타냄- 첫 줄은 72자 안에 들어가야 함
- 본문은 변경 내용과 이유를 추가로 설명해야 함
- 모든 커밋은
.pre-commit-config.yaml에 정의된 pre-commit hook을 통과해야 함