# 집에서 만든 CPU와 C 컴파일러로 Xv6 유닉스 계열 OS를 구동

**URL:** <https://discourse.ubuntu-kr.org/t/cpu-c-xv6-os/50042>\
**Category:** 자유 게시판\
**Tags:** 기타\
**Created:** [7월 2, 2025, 1:57오후 UTC](https://discourse.ubuntu-kr.org/t/cpu-c-xv6-os/50042 "2025-07-02T13:57:44Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![codemaker](https://discourse.ubuntu-kr.org/letter_avatar_proxy/v4/letter/c/f19dbf/32.png) [@codemaker](https://discourse.ubuntu-kr.org/u/codemaker)\
**Post date:** [7월 2, 2025, 1:57오후 UTC](https://discourse.ubuntu-kr.org/t/cpu-c-xv6-os/50042/1 "2025-07-02T13:57:45Z")

</div>

## 프로젝트 개요

- 본 프로젝트는 **Tokyo University 정보과학과** 의 대표적인 실험 과제로, 학생들이 중앙처리장치(CPU)와 하드웨어 설계, 컴파일러 제작, 애플리케이션 실행 경험을 쌓는 데 중점을 둠
- 프로젝트의 목표는 **자체 설계한 CPU의 ISA** 로 FPGA에 직접 구현하고, 이를 위한 **C 툴체인(Ucc)** 제작, 그리고 XO6와 같은 **운영체제 포팅** 으로 확대함
- 실험 과정의 대부분은 **자기주도 학습** 으로 진행됨

## CPU 실험과 과제

- 4~5인 팀이 각자 새로운 **CPU 아키텍처** 설계 및 FPGA 구현, 그리고 해당 아키텍처용 컴파일러 개발에 참여함
- OCaml 서브셋 컴파일러 제작 후 **레이 트레이싱 프로그램 실행** 까지가 필수 평가 항목임
- 추가적으로 시간 여유가 생기면 고유의 도전과제를 설정할 수 있으며, 일부 학생은 CPU 고속화, 멀티코어 개발, 음악/게임 실행 등 **확장 실험** 을 진행함
- Group 6 팀은 특히 **운영체제 포팅** 을 목표로, 여기서부터 새로운 공동팀(Group X)이 결성됨

## Xv6 OS와 이식 도전

- 이식 대상으로 **MIT에서 교육용으로 개발한 Xv6(Unix v6 기반, x86 용)** 선택
- Xv6는 간단한 유닉스 기반(OS)지만 실제 하드웨어 실행을 위한 **C89 컴파일러, 특수 인터럽트, 가상 주소 지원, 포터블성 부족 등 다양한 문제** 가 존재함
- Xv6는 C 언어 기준 `char` 1바이트, `int` 4바이트 등 x86 특성을 전제로 만들어져 있어, 이식 시 많은 문제가 발생함

## 컴파일러 및 툴체인 개발(Ucc)

- 기존 실험에서는 OCaml 컴파일러 개발이 표준이었으나, Xv6 구동을 위해서는 **C89 컴파일러** 가 필요해 직접 개발을 결정함
- 팀원 중 한 명의 **C 컴파일러 프로토타입** 을 기반으로, 새로운 툴체인을 자체 구축(Ucc)
- 컴파일러 뿐 아니라 **Primitive Linker** 및 디버그 도구 등도 직접 설계함

## CPU 및 시뮬레이터 설계

- 하드웨어 서술 언어(HDL, 예: Verilog / VHDL)로 CPU 회로 설계 후 Vivado/Quartus 등 논리합성 과정으로 실물 FPGA에 구현함
- 반복적인 논리합성 과정은 시간이 매우 오래 걸려 실질적으로 많은 대기 시간이 수반됨
- CPU 기본 기능 이후 **인터럽트, MMU, TLB** 등 OS 구동에 필요한 하드웨어 지원도 별도 설계
- GAIA라는 이름의 CPU로 완성됨
- 시뮬레이터에는 실제 인터럽트, 가상 주소 변환, 디버깅 툴 추가됨

## 이식 과정의 문제와 해결

- Xv6의 **포팅성 부족** 으로, CPU 및 컴파일러 사양에 따라 비정상적인 동작 발생
  - 예시: `char`와 `int`가 32비트로 정의되면서 포인터 연산 및 스택 구조가 깨지는 문제 등
  - 컴파일러 Ucc에서 `char`를 8비트로 맞추도록 개선

- 인터럽트 처리는 고난도 영역으로, 자체 시뮬레이터에 **분해기, 상태 덤프 등 디버깅 도구** 가 추가됨
- **캐시 알리아스** 이슈는 GAIA가 가상 주소로 캐시 인덱스 삼으면서 발생, **Page Coloring** 기법 도입으로 해결

## 최종 결과: OS 및 앱 실행

- 3월 1일 최종적으로 Xv6를 완전히 시뮬레이터와 실 CPU(하드웨어)에서 실행하는 데 성공함
- 자체 미니 curses, SL 명령, Minesweeper, 2048 등 **인터랙티브 앱** 구동 성공
  - 특히 2048은 논 캔터노컬(non-canonical) 입력 지원 설계 추가
  - Xv6 수정을 통해 POSIX 스타일의 ioctl, termios 등에 해당하는 기능까지 추가
  - 소형 assembler, mini vi 등도 구현, 실질적 ‘실시간 프로그래밍 환경’ 실현

- 레이 트레이싱 프로그램도 **운영체제 위** 에서 동작시켜 원래의 실험 목적 이상의 결과 달성

## 프로젝트의 의의와 후속 사례

- 본 실험 이후 여러 세대 학생들이 **직접 CPU와 OS를 만들어 다양한 실험을 지속적으로 수행함**
  - 예를 들어 RISC-V ISA 채택, 자체 OS, Linux 구동 등으로 확장

- 실습을 통해 직접 하드웨어/소프트웨어 전 스택을 경험하며 **알고리듬, 하드웨어-소프트웨어 통합, 저수준 구조** 에 대한 실질적 이해 증진
- “바퀴 재발명”이 비효율적이라는 비판도 있으나, 실제로 만들어 보며 배우는 학습효과와 재미는 매우 큼

## 실제 체험 및 소스 코드

- [GAIA CPU + Xv6 데모](https://nullpo-head.github.io/emcc-gaia-simu/xv6.html)에서 직접 실행 가능
- MIPS 포팅 버전은 [이곳](https://github.com/nullpo-head/xv6-mips)에서 오픈소스로 공개됨

## 결론

- “직접 만드는 것만큼 배우는 것은 없다”는 교훈과 함께, **하드웨어-소프트웨어 통합 경험의 중요성** 을 강조함
- 후속 학생들도 계속해서 새로운 목표에 도전하며, 미래엔 자체 ISA상에서 Linux나 VM이 구동될 수 있기를 기대함
- 프로젝트 참여 멤버들의 이름을 끝으로 이야기 마무리
