핵심 요약
- 한 개발자가 운영체제 없는 베어메탈 환경에서 구동되는 초소형 커널을 임베디드 스위프트로 작성해 QEMU에서 실행했습니다.
- C 표준 라이브러리가 전혀 없는 환경이라 어셈블리로 스택을 잡고 C 심볼과 링커 스크립트를 직접 맞추는 험난한 삽질 과정을 거쳤습니다.
- 리눅스를 대체하려는 게 아니라 OS 밑바닥 동작 원리를 공부하기 위해 진행한 실험으로 QEMU 화면에 메시지를 띄우는 데 성공했습니다.
요약 한 개발자가 애플의 프로그래밍 언어인 Swift(임베디드 스위프트)를 이용해 OS가 전혀 없는 베어메탈 환경에서 동작하는 최소한의 커널을 만들고 QEMU 에뮬레이터에서 실행하는 실험 과정을 공개했습니다. 기존 리눅스 등의 운영체제를 대체하려는 거창한 목적이 아니라, 운영체제의 도움 없이 프로그램이 어떻게 구동되는지 원리를 직접 파헤쳐 보기 위해 진행된 프로젝트입니다.
개발자는 먼저 운영체제나 표준 라이브러리가 없는 환경을 위해 설계된 경량 서브셋인 '임베디드 스위프트(Embedded Swift)'를 활용했습니다. 공식 배포판에는 아직 해당 표준 라이브러리가 포함되지 않아 개발용 스냅샷 툴체인을 설치해 기본적인 빌드 환경을 구축했습니다. 이후 애플 실리콘 맥에서 가상 머신 에뮬레이터인 QEMU의 ARM 64비트 베어메탈 타깃(aarch64-none-none-elf)을 대상으로 삼아 본격적인 커널 개발에 착수했습니다.
운영체제가 없는 환경이므로 CPU는 전원이 켜진 직후의 원시 상태로 시작하게 됩니다. 따라서 스위프트 코드가 안전하게 실행되기 전 스택을 설정하고 진입점을 잡아줄 최소한의 어셈블리 코드(boot.S)가 필요했습니다. 개발자는 멀티코어 환경에서 코어 0만 선택해 스택을 할당한 뒤 스위프트 진입 함수인 'kernel_main'으로 점프시키고, 나머지 코어들은 무한 대기 루프로 파킹하도록 처리했습니다.
또한 링커 스크립트 커스텀과 툴셋 설정을 거쳤는데, C 표준 라이브러리가 전무하기 때문에 putchar나 memmove 같은 필수 심볼이 정의되지 않거나 링커 섹션 불일치 에러를 마주하기도 했습니다. 결국 스위프트 함수를 C 호환 이름으로 노출(@c 속성 사용)하여 어셈블리와 연동하고 메시지를 출력하는 방식으로 초기 베어메탈 부팅에 성공했습니다.
Sponsored · 광고