NT 설계에 POSIX를 얹고 btrfs에서 self-hosting까지, hobby OS Moxnox 1.0 공개
- Moxnox 1.0은 시스템 콜과 저수준 인터페이스를 Windows NT 방식으로 설계하면서 GNU 기본 시스템을 갖춰, 유닉스용 프로그램을 재컴파일해 돌리는 hobby OS임
- 약 13만 줄의 C++로 작성돼 amd64와 aarch64에서 돌고, Moxnox 위에서 Moxnox를 다시 빌드하는 self-hosting까지 됨
- 루트 파일시스템은 btrfs인데 저자는 아직 실전 검증이 안 됐다며 일회용 파일시스템 말고는 마운트하지 말라고 경고함
- ELF 대신 PE 포맷을 쓰고 POSIX 함수는 Windows처럼 ucrtbase, iphlpapi, ws2_32에 나눠 두고 Windows에 없는 것만 mnposix에 넣음
- aarch64는 ARMv8.1 LSE 원자 연산이 필요해 Raspberry Pi 5부터 지원되고, Device Tree 없이 ACPI만 지원함
Hacker News opinions
NT 커널은 hobbyist들한테 거의 알려지지도 않았는데 평가가 너무 낮아. Linux가 한참 뒤에 자기 방식으로 만든 기능들을 NT는 처음부터 설계에 넣고 있었음.
설계된 흉칙한 것들도 한가득이지. I/O Manager랑 Object Manager, 필터, 드라이버 스택이 죄다 엉망이고 드라이버 위에는 캐싱이 아예 없어서 지금도 그 고통을 안고 삼.
그냥 VMS 베낀 걸로 보이는데. 구조가 너무 닮아 있음.
몇 년 전에 궁금해서 NT 설계 역사를 당시 Unix랑 비교해서 글을 썼는데 꽤 볼 만했음. jmmv.dev에 'windows-nt-vs-unix-design'으로 찾으면 나옴.
평가가 낮은 건 MS가 자초한 거지. 쓸 만한 기능이 서드파티 도구를 깔아야 접근되는 경우가 많았고 메뉴 속 메뉴에 파묻혀 있었음. 그러다 조금씩 중복 구현되거나 반쯤 만든 걸로 대체됐고.
실질적인 코드는 AI가 하나도 안 썼다는 줄에서 놀랐음. 이 정도면 진짜 대단한 거 아님?
PE를 ELF 대신 쓴 건 나도 동의해. ELF 동적 링킹은 솔직히 끔찍한 지저분한 덩어리임. 근데 POSIX 함수를 ucrtbase에 넣는 건 좀 웃기네. Windows에 없는 것만 mnposix로 뺐다니까 결국 Windows 구조 그대로임.
Darling만 제대로 성숙하면 WINE에 DOSBox, Darling까지 얹어서 DOS랑 Windows, Linux, macOS 바이너리를 한 번에 돌리는 게 지금도 가능하지 않음? BSD 쪽이 좀 약한 게 흠이지만.
Moxnox ucrtbase에 Windows ucrtbase에 없는 건 없음. open(), read(), write()는 원래부터 ucrtbase에 있는 POSIX 함수라고.
예전부터 모든 UNIX가 ELF를 쓴 건 아니었음. AIX나 z/UNIX는 COFF라고 PE 비슷한 포맷을 썼고, 거기서도 기본적으로 심볼이 사설이고 첫 호출 때 지연 로딩하는 걸 즐길 수 있었지.
중요한 건 syscall과 저수준 인터페이스만 NT를 따른다는 거임. 데몬이나 커널 내부 구조까지 따라가는 게 아님. ReactOS가 Windows를 똑같이 재현하는 걸 목표로 하는 것과는 정반대고.
그래서 왜 NT인 거임? 빠른가? 안전한가? 요즘 기능을 다 지원하나? 아니면 뜯어고치기 좋은가?
또 하나의 UNIX 클론이 아닌 건 칭찬할 만함. NT는 원래 POSIX스러웠는데 MS가 POSIX 서브시스템을 진지하게 다뤘다면 1993년에 PC에서 OS X 같은 경험이 가능했을지도 모름.
하드 파일 락 때문에 Windows Update가 지옥인데. 70년대에는 이유가 있었겠지만 지금은 그냥 짐임. 여기서는 안 구현됐으면 좋겠음.