← 목록
OS 2026-06-21 6KB 읽기 8분

CrownyOS 부팅 스플래시 결선 (2026-06-21)

개요

부팅스플래시.한선(두근두근타운 마을 스틸, 1024×600 PPM)을 QEMU virt 플랫폼 실제 부팅 시 ramfb 프레임버퍼에 표시되도록 결선 완료.


조사 결론: 현재 부팅→화면 경로

아키텍처별 프레임버퍼 경로

플랫폼경로특이사항
QEMU virt (AArch64)fw_cfg DMA → ramfb (0x46000000) → 640×480 XRGB8888스플래시 결선 대상
x86 UEFI (m70q/N100)GOP 선형 프레임버퍼 (efi_x86.ckernel_main)OVMF 필요
RPi5/OPi5/JetsonUART 로그 전용 (프레임버퍼 드라이버 별도 HAL)GUI 미결선

QEMU virt 부팅 시퀀스 (훅 지점 포함)

start_virt.S (MMU OFF)
  → kernel_main() [crownyc_os.c:109]
      → ramfb_init()          ← fw_cfg DMA로 ramfb 활성화
      → ramfb_draw_???()      ← ★ 스플래시 훅 지점 (MMU ON 이전)
      → mmu_enable()
      → hal 장치 초기화
      → TOAU VM 실행 (execute)

훅 지점: crownyc_os.c 117~119행. ramfb_init() 직후, mmu_enable() 직전. 이 시점이 유일한 안전 창이다 (MMU OFF = 캐시 일관성 보장, fw_cfg DMA 완료 상태).

PPM vs 프레임버퍼 관계

  • 화면초기화(W, H) + RGB사각형() + 원그리기() + 글쓰기() + 화면저장() opcode는 호스트에서 PPM 파일(/tmp/crownyos_gui.ppm)을 생성하는 경로. 베어메탈 ramfb에 직접 쓰지 않는다.
  • 베어메탈 ramfb 렌더는 hal/ramfb_virt.h의 C 함수(ramfb_draw_haneulnara, ramfb_draw_commands 등)가 담당.
  • 결선 전략: 부팅스플래시.한선의 그리기 로직을 C 함수 ramfb_draw_town_splash()로 포트해 기존 경로에 플래그로 선택.

구현: 결선 내용

변경 파일

파일변경 내용
/Users/ef/CrownyOS/hal/ramfb_virt.hramfb_draw_town_splash() 추가 (부팅스플래시.한선 C 포트)
/Users/ef/CrownyOS/crownyc/crownyc_os.cVIRT 경로에서 CROWNYOS_TOWN_SPLASH 플래그로 스플래시 선택

ramfb_virt.h 추가 함수

ramfb_draw_town_splash(unsigned int *fb) — 부팅스플래시.한선 충실 포트:

  • SPX/SPY/SPW/SPH 매크로로 1024×600 원본 좌표 → 640×480 스케일
  • sp_circle() — 스캔라인 채움 원 (원채움 함수 대응)
  • sp_roof() — 삼각 지붕 스캔라인 (지붕 함수 대응)
  • sp_tree() — 나무 (기둥 + 잎 3원) 대응
  • sp_house() — 파스텔 집 (몸체+지붕+문+창) 대응
  • 하늘 그라데이션, 태양 글로우, 구름, 잔디, 길, 집 5채, 나무, 타이틀 모두 포팅

crownyc_os.c 변경

c// 기존 (항상 ramfb_draw_commands)
{ unsigned int *fb = ramfb_init(); ramfb_draw_commands(fb); }

// 변경 후 (플래그 선택)
{
    unsigned int *fb = ramfb_init();
#ifdef CROWNYOS_TOWN_SPLASH
    ramfb_draw_town_splash(fb);
#else
    ramfb_draw_commands(fb);
#endif
}


QEMU 실행 절차

전제조건 확인 (완료)

  • /opt/homebrew/bin/qemu-system-aarch64 — 설치됨 (v10.2.1)
  • /Users/ef/CrownyOS/sdcard-virt/kernel8.img — 빌드 결과물 존재 (114720B)
  • AArch64 크로스컴파일러: aarch64-elf-gcc 또는 aarch64-none-elf-gcc

빌드 명령 (두근두근타운 스플래시 커널)

bashcd /Users/ef/CrownyOS

# 크로스컴파일러 (설치된 것 선택)
CROSS=aarch64-elf   # 또는 aarch64-none-elf / aarch64-linux-gnu

# 빌드
${CROSS}-gcc -c -o /tmp/ts/start.o boot/start_virt.S \
    -nostdlib -ffreestanding

${CROSS}-gcc -c -o /tmp/ts/crownyc_os.o crownyc/crownyc_os.c \
    -DPLATFORM_VIRT -DCROWNYOS_TOWN_SPLASH=1 \
    -DCROWNY_MEM_MAX=2097152 \
    -O2 -nostdlib -ffreestanding \
    -mgeneral-regs-only -Icrownyc -I.

${CROSS}-ld -T linker-virt.ld -o /tmp/ts/crownyos.elf \
    /tmp/ts/start.o /tmp/ts/crownyc_os.o

${CROSS}-objcopy -O binary /tmp/ts/crownyos.elf /tmp/ts/kernel8.img

QEMU 실행 (GUI 스플래시 확인)

bash/opt/homebrew/bin/qemu-system-aarch64 \
    -machine virt \
    -cpu cortex-a72 \
    -m 512M \
    -kernel /tmp/ts/kernel8.img \
    -device ramfb \
    -display gtk

무인 스크린캡처 (자동 검증)

bash# 백그라운드 기동 + TCP monitor
/opt/homebrew/bin/qemu-system-aarch64 \
    -machine virt -cpu cortex-a72 -m 512M \
    -kernel /tmp/ts/kernel8.img \
    -device ramfb -display none \
    -monitor 'tcp::4444,server,nowait' &

sleep 8
echo 'screendump /Users/ef/CrownyOS/시작화면/boot-splash-qemu.ppm' | nc localhost 4444

통합 스크립트

bashzsh /Users/ef/CrownyOS/시작화면/부팅스플래시-qemu.sh


기존 부팅을 깨지 않는 방법

  • CROWNYOS_TOWN_SPLASH 플래그가 없으면 기존 ramfb_draw_commands(fb) 경로를 그대로 탄다.
  • 기존 build-crownyos.sh virt 빌드는 변경 없음.
  • 새 빌드 타겟만 -DCROWNYOS_TOWN_SPLASH=1을 추가.

관련 파일

역할경로
스플래시 원본 (한선씨)/Users/ef/CrownyOS/시작화면/부팅스플래시.한선
PPM 산출물/Users/ef/CrownyOS/시작화면/boot-splash.ppm
C 포트 함수 추가/Users/ef/CrownyOS/hal/ramfb_virt.h
커널 결선/Users/ef/CrownyOS/crownyc/crownyc_os.c
QEMU 실행 스크립트/Users/ef/CrownyOS/시작화면/부팅스플래시-qemu.sh
결선 로직 한선씨 동반/Users/ef/CrownyOS/시작화면/부팅스플래시-결선.한선
ramfb 헤더 (기존)/Users/ef/CrownyOS/hal/ramfb_virt.h

잔여 이슈

  1. 크로스컴파일러 미확인: aarch64-elf-gcc 설치 여부 미확인 (Bash 권한 없음). 설치 필요 시 brew install aarch64-elf-gcc.
  2. 글자 렌더: 5×7 비트맵 글리프는 ASCII만 지원 — "두근두근, 오늘의 크라우니 마을" 한글 자막은 표시 불가. 한글 폰트 비트맵을 추가하거나 4상 TOAU 색 점 패턴으로 대체 필요.
  3. 해상도 갭: 원본 1024×600, ramfb 640×480. 스케일 다운 시 circle 품질 저하 가능. ramfb 해상도 확장(1024×600)으로 근본 해결 가능(ramfb_virt.h의 FB_W/FB_H 상수 변경).
  4. x86 경로: efi_x86.c + kernel_x86.c는 GOP fb에 4상 TOAU 체크무늬를 그림. 여기에 마을 스플래시를 결선하려면 같은 방식으로 fb_draw_boot_mark() 대신 마을 그리기 함수로 교체하면 됨(OVMF/실 하드웨어 필요).
  5. screendump 자동화: QEMU monitor TCP는 인증 없이 열림. 실 CI 파이프라인에서는 방화벽 고려 필요.