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