1P by GN⁺ | ★ favorite | 댓글 1개
  • TacOS는 C와 어셈블리로 처음부터 작성한 자체 커널 기반의 UNIX-like 취미용 OS이며, DOOM과 여러 작은 사용자 공간 프로그램을 실행할 수 있음
  • 커널에는 VFS, 스케줄러, TempFS, 장치, 컨텍스트 스위칭, 가상 메모리 관리, 물리 페이지 프레임 할당, Doom 포팅이 포함됨
  • 실행 환경은 실제 하드웨어와 Qemu 에뮬레이터를 모두 지원하며, 실제 하드웨어는 제작자의 노트북에서 테스트됨
  • 빌드와 실행은 git clonemake run으로 시작하며, Xorriso, Qemu, NASM, Clang 설치가 필요함
  • TacOS는 실제 사용을 위한 완성도는 아니며, 취미용 toy OS로 여러 알려진 버그가 있음

TacOS 개요

  • TacOS는 C와 어셈블리로 작성된 from-scratch OS이며, 자체 커널을 가짐
  • UNIX-like 커널로 구성되어 있으며, DOOM과 여러 작은 사용자 공간 프로그램을 실행할 수 있음
  • 주요 구성 요소는 다음과 같음
    • VFS
    • 스케줄러
    • TempFS
    • 장치
    • 컨텍스트 스위칭
    • 가상 메모리 관리
    • 물리 페이지 프레임 할당
    • Doom 포팅

실행 환경과 한계

  • TacOS는 실제 하드웨어와 Qemu 에뮬레이터에서 실행 가능함
  • 실제 하드웨어 테스트는 제작자의 노트북에서 수행됨
  • 프로젝트는 실제 사용 가능한 완성형 OS가 아니라 취미용 toy OS
  • 여러 알려진 버그가 있음

빠른 시작

  • 빌드와 실행은 다음 명령으로 가능함
git clone https://github.com/UnmappedStack/TacOS
cd TacOS && make run
  • make run은 TacOS를 빌드하고 Qemu 에뮬레이터에서 자동 실행함
  • 필요한 도구는 다음과 같음
    • Xorriso
    • Qemu
    • NASM
    • Clang

빌드 명령

  • make run: TacOS를 빌드하고 Qemu에서 실행함
  • make qemu: 이미 빌드된 TacOS를 Qemu에서 실행함
  • make disk: 전체 디스크 이미지를 tacos.iso로 빌드함
  • make kernel: 시스템 핵심인 TacOS 커널을 빌드함
  • make libc: 표준 라이브러리를 빌드함
  • make userspace: 사용자 공간 애플리케이션을 빌드함
  • make initrd: 시스템이 부팅할 초기 램디스크를 생성함
  • make lint: 커널에 대한 린터 규칙을 실행함
  • make qemu-gdb: GDB가 연결된 상태로 TacOS를 Qemu에서 실행함

디버깅

  • TacOS 테스트 중 GDB를 붙이려면 make qemu-gdb를 실행한 뒤, 다른 터미널에서 GDB 원격 타깃에 연결함
$ gdb -q
(gdb) target remote :1234
(gdb) file kernel/bin/tacos
(gdb) continue
  • 커널을 디버깅할 때는 kernel/bin/tacos를 지정함
  • 사용자 공간 프로그램을 디버깅할 때는 initrd/usr/bin/<program>을 지정함

라이선스와 기여 규칙

  • TacOS는 Mozilla Public License 2.0을 사용함
  • 기여는 열려 있지만, pull request 전에 issue를 열고 변경 사항을 할당받아야 함
  • 단순 오타나 문법 수정만 담은 pull request는 병합되지 않음
  • 커밋 메시지는 [component] change 형식을 따라야 함
  • 관련 없는 여러 컴포넌트의 수천 줄 변경을 하나의 거대한 커밋으로 담은 pull request는 리뷰 대상이 되지 않음

커뮤니티

  • TacOS 관련 업데이트와 OSDev 프로젝트 도움, 대화를 위한 Discord 서버가 있음

댓글과 토론

Hacker News 의견들
  • 축하함! 자랑스러울 듯하고, 개념 증명으로 DOOM을 고른 것도 좋음
    초보 질문뿐이라 김빠질 수도 있겠지만, 이걸 노트북에서 실행하려면 어떤 절차가 필요한지 궁금함
    빌드한 뒤에는 Windows PC에서 듀얼 부팅을 설정하는 것과 비슷한 과정이 있는 건가 싶음. 인터넷의 낯선 사람에게 내 컴퓨터에서 위험한 소프트웨어를 실행하는 법을 묻고 있다니 좀 웃김
    이런 프로젝트를 해보고 싶다면 추천할 만한 교재나 읽을거리도 궁금함. 대학에서 운영체제와 관련 과목을 듣긴 했지만, 전기전자 전공이라 전부 매우 추상적이고 개념 중심이었음. 더 구체적인 자료가 있으면 좋겠고, 꼭 x64일 필요는 없음

    • 전혀 김빠지지 않음! 내 노트북에서 실행한 방법은 말 그대로 ISO로 USB를 포맷하고 USB로 부팅한 것뿐임
      커널을 작성해보고 싶다면 먼저 https://osdev.wiki를 보는 걸 추천하고, Intel Developer Manual 같은 관련 명세와 직접 작성할 드라이버 명세도 읽어야 함
      x86이 아닌 커널 개발은 잘 모르지만, 아는 한 개념은 대부분 같고 기술적 구현만 다름. 프로젝트 README에 Discord 서버 링크가 있고, 거기에는 정말 똑똑한 사람들이 많아서 기꺼이 도와줄 것임
    • 나도 아직 완성되진 않았지만 커널을 작성했고, 내가 밟은 모든 단계를 문서화했음. 많은 사람이 유용하다고 했음: https://0xc0ffee.netlify.app/osdev
  • 좋긴 한데, 네 타코도 DOOM을 실행할 수 있나?
    농담이고, 정말 칭찬할 만한 노력이고 잘했음! 궁금한 점은 TacOS를 만들면서 DOOM을 표준 목표처럼 삼은 건지, 아니면 DOOM만 실행하는 전용 운영체제를 처음부터 만드는 게 목표였는지임
    순수한 호기심에서 묻는 것임. 거의 30년 전쯤 배움과 재미를 위해 부팅만 되는 극도로 뼈대뿐인 운영체제를 만든 적이 있는데, 사실상 DOOM만 실행할 수 있으면서 어디에나 이식 가능한 전용 운영체제라면 “이거 DOOM 돌아감?” 밈이 훨씬 더 아이러니하고 재미있어질 듯함
    멋진 작업이고 계속해주면 좋겠음

    • Doom만 실행할 수 있는 건 아니고, 그게 가장 최근에 이식한 마일스톤일 뿐임
      Doom 자체를 돌리는 데는 libc 요구사항 추가까지 포함해서 대략 일주일 정도 걸렸고, 그 전에 깔아둔 기반 작업이 훨씬 더 많았음
      DoomGeneric을 사용했는데, 기본적으로 아주 이식성 좋게 만든 Doom 포크임. 질문에 답이 됐으면 좋겠고, 혹시 내가 잘못 이해했을 수도 있음
  • 처음부터 만든 커널에서 바로 DOOM까지 가는 건 최상급 해커 인증 같은 작업임. 실제 하드웨어에서 돌아가는 걸 보면 정말 기쁠 듯하고 아주 멋짐

    • 실제 하드웨어에서 돌아가는 건 꽤 기쁨. 커널이 정확히 Doom으로 바로 들어가는 건 아니고, 셸로 부팅한 다음 거기서 Doom을 실행할 수 있는 구조이긴 함
  • 약간 곁가지지만 비슷한 걸 궁금해했음. 현대 PC 하드웨어에서 직접 부팅되는 게임을 만들려는 시도가 많았는지 궁금함
    전체 운영체제를 올리지 않고 바로 게임으로 들어가는 방식이고, 예전 세대 게임 콘솔과 비슷함. 단순하게 유지하려면 Wi-Fi, 블루투스, GPU 같은 건 현대 드라이버 없이는 활용하기 어렵겠지만, 키보드와 마우스는 기본 BIOS 접근 같은 게 있어서 꽤 가능해 보임. 용어는 틀렸을 수 있지만 요지는 전달됐으면 함

    • 많이 쓰였는지는 모르겠지만, 알려진 방식이고 동작함. 초기 x86-16 어셈블리 실험에서 이런 걸 했는데, 결국 qemu보다 쓰기 쉬운 에뮬레이터인 dosbox-staging을 쓰려고 DOS를 프로그램 실행기로 사용하게 됨
      디스크 입출력에 들어가고 싶지 않다면 큰 제한은 512바이트 이하라는 점임. 사실상 프로그램을 마스터 부트 레코드로 실행하는 것이기 때문임. 더 많은 공간이 필요하면 디스크에서 LBA를 몇 개 읽어와야 하고, 이를 위한 인터럽트도 있으며 osdev에는 더 나은 자료도 있음
      그 외에는 .com 파일, 보통 64KB 단일 세그먼트 제한, 과 MBR 스타일 부팅 가능 프로그램의 차이는 꽤 작음
  • 정말 멋진 작업임. 나도 이런 걸 할 실력이 있으면 좋겠지만, 이걸 해내려면 명세를 많이 읽어야 했을 텐데 그게 내 가장 약한 부분임
    바보 같은 질문일 수 있지만, GPU 가속을 아주 작은 형태로라도 쓰고 싶다고 하면 GPU 드라이버를 만드는 게 얼마나 어려울지 궁금함. 관련 문서가 잘 되어 있다고 보나?

    • 그건 아마 운영체제 개발의 극한 영역일 것 같고, 적어도 실제로 살 수 있는 GPU용 드라이버라면 나도 못 할 가능성이 큼
      Qemu의 에뮬레이션 GPU는 문서가 꽤 괜찮아서 가능할 수 있지만, Nvidia GPU 같은 건 문서화가 나쁘고 최근까지는 문서가 완전히 비공개였음. Linux도 이 문제로 고생하고, 결국 Linux의 GPU 드라이버를 가져다 쓰는 취미 운영체제 개발자들도 몇몇 봄
      거의 불가능하다고 표시해둔 일이 많지는 않지만, 흔한 GPU용으로 정말 괜찮은 GPU 드라이버를 작성하는 건 솔직히 내가 언젠가 할 수 있을 것 같지 않음
  • unmapped 안녕, GitHub와 Discord에서 ThatOSDeveloper로 쓰고 있고 그게 내 표시 이름임. TacOS에서 Doom을 돌렸는지는 몰랐는데 꽤 멋짐
    몇 가지 궁금한 게 있음. 원본 Doom인지, 디스크에 있는지 initramfs에 있는지, 그리고 사용하는 엔진과 함께 Freedoom을 쓰는지 셰어웨어 Doom WAD를 쓰는지 궁금함

    • 글에서 볼 수 있듯이 doomgeneric이고, 이 페이지 상단에서 볼 수 있듯이 수정은 꽤 적게 들어감
    • Doom의 이식성 좋은 포크인 DoomGeneric을 사용함. initrd에서 로드한 TempFS 위에 있고, doom1.wad를 씀
  • 아주 멋지지만, 요즘은 저수준이면서 메모리 안전한 언어가 있는데 왜 안전하지 않은 언어를 고른 건지 궁금함. 보안 버그 대부분이 메모리 관련이라는 건 이미 다 알고 있음
    취미 프로젝트라는 건 이해하지만, 더 나은 대안이 있는 상황에서 왜 안전하지 않은 언어를 퇴출하지 않는지 모르겠음

    • 주로 C가 훨씬 단순하기 때문이고, 커널 개발에서는 단순함이 전부
      다른 프로젝트에서는 Rust를 써봤지만, 커널 개발에서는 안전한 언어보다 단순하고 읽기 쉬운 언어를 훨씬 더 쓰고 싶다는 느낌임
  • 클럽에 온 걸 환영함! 거의 같은 일을 해봤고, 제품으로 이어질 일이 절대 없는 무언가를 만드는 평온함을 정말 즐겼음
    https://jakobbr.eu/2024/08/19/writing-my-own-x86_64-operatin...

  • 정말 멋진 프로젝트임! TacOS에서 프로세스 격리와 스케줄링은 어떻게 처리하는지 궁금함

    • 가상 메모리에는 페이징을 사용해서 각 프로세스가 자기 주소 공간을 갖게 함
      PIT 드라이버에 연결된 라운드 로빈 스케줄러가 있어서, 10ms마다 PIT가 인터럽트를 발생시키고 스케줄러가 실행됨. 스케줄러는 다음 작업을 고르고, 이전 작업의 현재 상태를 저장하고, 새 주소 공간으로 전환하고, 스택을 바꾸고, 작업의 레지스터를 복원한 뒤, iretq 명령으로 ring 3 사용자 모드로 전환하면서 명령 포인터로 점프함
  • TacOS에 대해 더 알고 싶음. 여러 프로그램을 동시에 안전하게 실행하는 건 어떻게 관리하나?