2P by neo 1달전 | ★ favorite | 댓글 1개

banan-os

이 프로젝트는 C++로 작성된 취미 운영체제이며, x86_64 및 i686 아키텍처를 지원함. 이는 다른 제품이나 기존 오픈 소스 프로젝트와 비교하여 독특한 학습 경험을 제공함.

기능

  • 일반

    • Ring3 사용자 공간
    • SMP(다중 처리)
    • 선형 프레임버퍼(VESA 및 GOP)
    • 네트워크 스택
    • ELF 실행 파일 로딩
    • AML 인터프리터(부분적)
    • 기본 그래픽 환경
      • 터미널 에뮬레이터
      • 상태 표시줄
      • 프로그램 실행기
      • 몇 가지 유용한 앱
    • ELF 동적 링크
    • copy-on-write 메모리
      • 파일 매핑
      • 익명 매핑
  • 드라이버

    • NVMe 디스크
    • ATA(IDE, SATA) 디스크
    • E1000 및 E1000E NIC
    • RTL8111/8168/8211/8411 NIC
    • PS2 키보드(모든 스캔코드 세트)
    • PS2 마우스
    • USB
      • 키보드
      • 마우스
      • 대용량 저장소
      • 허브
    • virtio 장치(네트워크, 저장소)
  • 네트워크

    • ARP
    • ICMP
    • IPv4
    • UDP
    • TCP(부분적 및 버그 있음)
    • Unix 도메인 소켓
    • SSL
  • 파일 시스템

    • 가상 파일 시스템
    • Ext2
    • FAT12/16/32
    • Dev
    • Ram
    • Proc
    • Sys
    • 9P
  • 부트로더 지원

    • GRUB
    • 사용자 정의 BIOS 부트로더
    • 사용자 정의 UEFI 부트로더

코드 구조

각 주요 구성 요소와 라이브러리는 자체 하위 디렉토리를 가짐. 각 디렉토리에는 해당 구성 요소의 모든 헤더 파일이 포함된 include 디렉토리가 있음. 모든 헤더는 절대 경로로 포함됨.

빌드

필요한 패키지

  • apt (Ubuntu 22.04에서 테스트됨)

    • 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
  • 운영체제 자체를 빌드하려면 다음 명령어 중 하나를 실행할 수 있음. 디스크 이미지 생성/수정을 위해 루트 권한이 필요함.

    • ./bos qemu
    • ./bos qemu-nographic
    • ./bos qemu-debug
    • ./bos bochs
  • 커널이나 디스크 이미지를 실행하지 않고 빌드할 수도 있음.

    • ./bos kernel
    • ./bos image
  • 다른 아키텍처를 위해 빌드하려면 환경 변수 BANAN_ARCH=_arch_를 설정함(e.g. BANAN_ARCH=i686).

  • 부트로더를 변경하려면 환경 변수 BANAN_BOOTLOADER를 설정함. 지원되는 값은 BANAN(사용자 정의 부트로더) 및 GRUB임.

  • UEFI로 실행하려면 환경 변수 BANAN_UEFI_BOOT=1을 설정함. 또한 OVMF_PATH를 올바른 OVMF로 설정해야 함(기본값 /usr/share/ovmf/x64/OVMF.fd).

  • 디스크 이미지가 손상되었거나 새로 만들고 싶다면, 수동으로 _build/banan-os.img_를 삭제하거나 다음 명령어를 실행할 수 있음.

    • ./bos image-full
  • zsh를 위한 셸 완성 스크립트도 생성됨. _script/shell-completion/zsh/_bos_ 파일을 /usr/share/zsh/site-functions/로 복사하거나 .zshrcfpath_script/shell-completion/zsh_를 추가할 수 있음.

기여

  • 업스트림은 개인 서버에 호스팅되므로, 기여를 병합하는 것이 GitHub에서처럼 간단하지 않음. GitHub에서 PR을 보내면 diff를 다운로드하여 수동으로 적용할 수 있음. 원한다면 개인 git 서버에 계정을 제공할 수 있음. 이 경우 이메일이나 디스코드를 통해 연락 바람.

  • 이는 주로 학습 경험이므로, 새로운 기능을 추가하기 전에 이메일, 디스코드, 이슈 등을 통해 먼저 연락해 주길 바람. 만약 내가 계획하고 있던 작업에 대해 문의 없이 PR을 보내면, PR을 닫을 가능성이 높음. 버그 수정은 언제나 환영함.

  • 커밋 메시지는 다음과 같이 포맷해야 함.

    1. 첫 번째 줄은 " Subject: Description " 형식이어야 하며, _Subject_는 영향을 받은 영역(Kernel, Shell, BuildSystem 등)을 나타내고, _Description_은 변경 사항에 대한 간단한 설명이어야 함. 첫 번째 줄은 72자 이내로 작성해야 함.
    2. 메시지 본문은 변경 사항과 변경 이유를 자세히 설명해야 함.
  • 모든 커밋은 .pre-commit-config.yaml에 정의된 pre-commit 훅을 통과해야 함. pre-commit 설정 방법에 대한 지침은 pre-commit.com을 참조 바람.

Hacker News 의견
  • USB 드라이버를 처음부터 구현한 점을 칭찬함. "cat doom1.wad"를 입력하여 시스템을 깨뜨렸다고 언급함
  • 프로젝트 이름이 마음에 듦. 구현한 것 중 가장 어려운 부분이 무엇인지, 그리고 심각한 장애물이 있었는지 질문함
  • 새로운 OS 커널 발표에 관례적으로 포함되는 문장이 빠져 있다고 언급함
  • 프로젝트가 매우 멋지다고 생각함. 주당 몇 시간 정도 이 프로젝트에 투자하는지, 그리고 학생 프로필이 대학생을 의미하는지 질문함. 만약 그렇다면, 학업의 일환으로 OS 작업을 했는지 궁금해함
  • 개발 과정이 어떻게 진행되는지 궁금해함. VM에서 실행하는지, 아니면 실제 하드웨어에서 실행하는지 질문함. 개발 중 배운 점과 개발 기록을 어떻게 관리하는지 질문함
  • 많은 작업이 필요했음을 인정함. 두드러진 도전 과제가 무엇인지 궁금해함
  • 예상치 못한 기능 세트를 가진 프로젝트라고 생각함. 더 많은 소프트웨어를 이식할 계획이 있는지 질문함
  • 프로젝트가 멋지다고 생각함. 포크의 대체 이름으로 "PlatanOS"를 제안함
  • 매우 인상적인 성과라고 생각하며, 프로젝트 이름도 마음에 듦
  • 멋진 사이드 프로젝트라고 축하함. 비슷한 프로젝트를 시도하고 싶은 사람들을 위한 시작점이나 자료에 대한 팁을 요청함