우리 집에서 만든 CPU와 C 컴파일러로 Xv6 유닉스 계열 OS를 구동한 경험

19 hours ago 2

  • University of Tokyo의 학생 프로젝트에서, 직접 설계한 RISC ISA 기반 CPU자체 제작한 C 컴파일러를 이용해 Xv6 운영체제 포팅을 시도함
  • 프로젝트는 CPU 설계, C 컴파일러(Ucc) 개발, Xv6 이식 등 모든 요소를 직접 만드는 방식으로 진행됨
  • 팀은 OS 동작을 위해 인터럽트, 가상 메모리, 캐시 등 핵심 하드웨어·소프트웨어 기능 설계에 도전함
  • Xv6 이식 과정에서 이식성 문제, 디버깅의 어려움, 캐시 버그 등 다양한 난관에 직면했으나 자체적으로 해결함
  • SL, Minesweeper, 2048 등 인터랙티브 애플리케이션과 ray-tracing 프로그램 구동까지 성공하여 교육적·기술적으로 큰 성취를 경험함

프로젝트 개요

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

실제 체험 및 소스 코드

결론

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

Read Entire Article