BOOT4초 만에 프롬프트
QEMU에 커널과 initrd를 넘기고 녹화를 함께 시작했다. 커널 메시지는 시리얼로만 가고, 화면의 첫 픽셀은 우리 terminal이 찍는다.
- PID 1은
/init— Zig로 쓴 우리 프로그램이다 - 죽은 자식은 다시 띄운다. terminal도, 셸도, 서비스도
- 맨 아래 줄은 상태 줄: 한/영 · 자판 · 라틴 배열 · 대문자 잠금
root@(none) ~# cat /proc/1/comm
직접 빌드한 Linux 커널 위에, 직접 만든 init(PID 1)과 터미널을 올린 시스템.
셸까지 가는 길에 배포판의 부품을 쓰지 않는다. 커널이 어디까지 책임지고 어디서부터 우리 코드인지를 매 단계 확인하면서 만든다. 데스크톱도, X도, Wayland도 없다 — 프레임버퍼에 픽셀을 직접 찍는다.
부팅은 사슬이다. 앞 칸은 다음 칸을 메모리에 올리고 손을 뗀다. 우리가 쓴 것은 주황색 칸이고, 파란 칸은 직접 빌드하고 설정하지만 코드는 남의 것이다.
tars.conf가 고른다아래 영상은 전부 QEMU monitor의 sendkey로 키를 치고 screendump로 0.1초마다 뜬 프레임이다. 편집이나 합성은 없다 — 찍는 스크립트는 저장소의 site/capture.sh다.
QEMU에 커널과 initrd를 넘기고 녹화를 함께 시작했다. 커널 메시지는 시리얼로만 가고, 화면의 첫 픽셀은 우리 terminal이 찍는다.
/init — Zig로 쓴 우리 프로그램이다입력기 데몬이 없다. evdev 키 코드를 받아 terminal 안의 오토마타가 자모를 모으고, 조합 중인 글자는 커서 아래에 그린다. 화면의 자판은 신세벌식 PCS.
EN ↔ 한이 함께 바뀐다마우스 없이 화면 위로 올라가 찾고, 고르고, 붙인다. 매치는 앰버로, 지금 매치는 더 밝게. 검색창에는 /Freeing [3/4]처럼 위치가 뜬다.
vim이 DECSCUSR로 부탁하는 모양을 그린다 — insert는 막대, normal은 블록, replace는 밑줄. 한글을 치다가 Esc를 누르면 조합을 끝내고 영문으로 돌아와서 다음 키가 명령이 된다.
tars.conf에서 끌 수 있다mouse=abat · eza · rg · fd · fzf 등 도구가 기본TARS는 한 번 멈췄다. 이전 저장소에서 "이해 없이 코드만 쌓이는" 문제로 막혀 처음부터 다시 시작했다. 이번 재시작의 목표는 빨리 만드는 것이 아니라, 커널이 어디까지 하고 어디서부터 우리 몫인지를 매번 몸으로 확인하는 것이다.
무엇을 왜 만드는지, 코드를 던지기 전에 말한다.
빌드 · QEMU 부팅 · 게이트를 실제로 돌린다. 짐작하지 않고 잰다.
로그가 왜 그렇게 나왔는지 읽는다. 실패가 정상인 단계는 왜 정상인지 짚는다.
체인마다 QEMU 안에서 화면 픽셀과 로그로 본다. 통과해야 다음으로 간다.
"init 없는 kernel panic"이 첫 milestone의 성공 조건이었다. 무엇이 없어서 멈추는지를 먼저 보고, 그 빈자리에 우리 코드를 하나씩 넣었다.— Boot Foundation, BF-M1
서브프로젝트마다 design doc과 milestone별 plan을 쓰고, 끝나면 무엇을 배웠는지 기록한다. 전부 docs/에 있다.
공개된 ISO를 받아 바로 띄우거나, 소스에서 직접 빌드한다. ISO는 x86_64 하나이고 BIOS · UEFI 양쪽으로 뜬다. 메모리는 1GB를 주고, 실기에서는 Secure Boot를 끈다. 자세한 절차는 docs/guides/running-tars.md.
$ git clone https://github.com/soomtong/tars-linux $ cd tars-linux $ docker build -t tars-devcontainer -f devcontainer/Dockerfile . $ make boot-qemu # 전부 빌드하고 설정 디스크를 붙여 QEMU로 $ make run-qemu # 빌드 없이 다시 띄우기
$ make check CHAIN=config # 체인 하나 $ make gate # 루트 게이트 — 전 체인 # 노트북: out/tars.iso를 USB에 굽고 UEFI로 # 깔기: tars-install <디스크>