RISC-V, OpenSBI, Zig 조합으로 구현한 운영체제 커널 탐구

by DD
2개월 전
조회수 10

RISC-V 아키텍처 기반의 운영체제 커널(Operating System Kernel)을 Zig 언어로 구현하여 저수준 시스템 프로그래밍에 대한 이해를 높임

Unikernel 방식을 채택, 애플리케이션 코드와 OS 커널을 단일 바이너리로 묶어 로딩 및 링킹 과정을 단순화

스레드(Thread) 가상화를 통해 단일 코어에서 여러 스레드를 실행하며, 인터럽트 기반의 컨텍스트 스위칭(Context Switching) 구현

OpenSBI를 활용하여 콘솔 출력(Console Output) 및 타이머 하드웨어 제어, 사용자 공간과 커널 공간 분리

Unikernel 아키텍처와 시스템 부팅 과정

본 프로젝트는 Unikernel 방식을 채택하여 애플리케이션 코드와 OS 커널을 하나의 바이너리 파일로 묶는다. 이는 링커(Linker)와 로더(Loader)를 거치는 복잡한 과정을 생략하여 시스템 부팅 과정을 단순화한다. 시스템은 M-mode에서 시작하여 OpenSBI를 통해 초기화된 후, S-mode에서 커널이 실행되고, U-mode에서 사용자 스레드가 실행되는 구조를 가진다. 이러한 구조는 RISC-V의 권한 모델(Privilege Model)을 활용하여 시스템의 안정성을 확보한다.

스레드 가상화 및 컨텍스트 스위칭 구현

본 커널은 스레드(Thread) 가상화를 통해 단일 코어에서 여러 스레드를 동시에 실행한다. 각 스레드는 자신만의 아키텍처 레지스터(Architectural Registers)와 스택(Stack)을 가지며, 타이머 인터럽트(Timer Interrupt)를 활용하여 컨텍스트 스위칭(Context Switching)을 수행한다. 인터럽트 핸들러(Interrupt Handler)는 레지스터를 저장하고 복원하는 역할을 담당하며, 이를 통해 각 스레드는 독립적인 실행 환경을 유지한다. 특히, S-mode 핸들러에서 CSR(Control and Status Registers)을 저장하고 복원하는 과정이 핵심이다.

Zig 언어와 RISC-V 아키텍처의 결합

본 프로젝트는 시스템 프로그래밍에 적합한 Zig 언어를 사용하여 RISC-V 아키텍처 기반의 커널을 구현했다. Zig는 메모리 관리(Memory Management) 및 저수준 제어(Low-level Control)에 대한 강력한 기능을 제공하며, C 언어에 비해 안전성과 가독성을 높인다. 특히, Zig의 네이키드 호출 규약(Naked Calling Convention)을 활용하여 어셈블리 코드를 직접 작성, S-mode 핸들러를 구현했다. 이는 RISC-V의 하드웨어 특징을 최대한 활용하기 위한 전략이다.

SBI 레이어 활용과 I/O 드라이버 구현

본 커널은 OpenSBI를 활용하여 콘솔 출력(Console Output) 및 타이머 하드웨어를 제어한다. OpenSBI는 M-mode에서 실행되며, S-mode 커널에 추상화된 인터페이스를 제공하여 하드웨어 종속성을 줄인다. 또한, SBI를 사용할 수 없는 경우를 대비하여 직접 MMIO(Memory-Mapped I/O)를 사용하는 UART 드라이버(UART Driver)를 구현했다. 이러한 이중 접근 방식은 시스템의 이식성을 높이고, 다양한 환경에서 커널을 실행할 수 있도록 한다.

Writing an operating system kernel from scratch