Swift로 QEMU에서 베어메탈 커널 구현하기
원제 A minimal kernel in Swift, running in QEMU
101 포인트댓글 26
Key Point
OS 없는 베어메탈 환경에서 고수준 언어로 커널을 작성할 수 있음을 보여주는 실험으로, Swift의 Embedded 서브셋이 시스템 레벨 프로그래밍에 적용 가능함을 입증한다.
핵심 요약
- Embedded Swift(OS와 표준 라이브러리가 없는 환경용 Swift 부분집합)를 사용해 QEMU 가상 머신에서 실행되는 최소 커널을 작성한 실험 프로젝트이다.
- aarch64-none-none-elf 타겟(OS 없는 64비트 ARM)으로 컴파일하기 위해 toolset.json에서 experimental 기능 활성화, 표준 라이브러리 링킹 비활성화, 커스텀 링커 스크립트 사용 등을 설정했다.
- CPU가 원시 상태에서 시작되므로 boot.S 어셈블리 파일에서 _start 심볼 정의, 스택 설정, Swift 진입점 호출, 보조 코어 대기 처리를 수행한다.
- Embedded Swift의 print 구현에 필요한 putchar 함수를 QEMU의 PL011 UART 메모리맵 레지스터(0x09000000)에 직접 쓰기로 구현하고, Swift 저수준 코드가 필요로 하는 memmove 함수도 제공했다.
- linker.ld 스크립트에서 커널 로드 위치(0x40080000), 부트 코드·읽기전용 데이터·초기화 데이터·미초기화 데이터·스택 배치, ELF 메타데이터 섹션 명시적 배치를 정의한다.
- 빌드하면 어셈블리 진입점에서 시작하고 표준 라이브러리 없이 링킹되며 수동으로 설정한 스택 위에서 Swift 코드를 실행하는 실제 AArch64 ELF 실행 파일이 생성된다.
- PL011 UART의 수신 레지스터와 플래그 레지스터(bit 4의 RXFE)를 확인하는 readChar 함수로 입력을 받을 수 있으며, 폴링 방식으로 키보드 입력에 응답하는 프롬프트 기능을 추가했다.
- 지금 구현된 것은 메시지 출력과 문자 입력 에코뿐이며, BSS 섹션 초기화, UART 추상화, 할당 기능 지원, 인터럽트·타이머, 메모리 프레임버퍼·키보드 드라이버, 인터럽트 기반 입력 등 다양한 개선 방향이 남아 있다.