U-Boot Verified Boot — RSA 서명과 public key 임베딩 흐름
부트로더가 커널을 그냥 점프하면, 디스크를 잠시라도 만질 수 있는 공격자는 마음대로 커널을 바꿔 끼울 수 있습니다. Verified Boot은 이 한 줄을 잘라내는 작업입니다. ROM이 SPL을 검증하고, SPL이 U-Boot를 검증하고, U-Boot이 커널·DT·initramfs를 검증합니다. 한 단계라도 서명이 안 맞으면 부팅을 끊습니다.
#한 줄 요약
RSA 키 쌍의 public key를 U-Boot의 control DT에 박아 두면, U-Boot은 부팅 직전에 FIT 이미지의 서명을 그 키로 검증해 신뢰 체인을 닫습니다.
#신뢰 체인이 닫히는 지점
신뢰 체인은 변경 불가능한 곳에서 출발해야 합니다. 보통 SoC ROM이 그 자리를 맡습니다. ROM은 OTP에 적힌 hash나 public key로 SPL을 검증하고, SPL은 같은 방식으로 U-Boot를 검증합니다. U-Boot까지 도달하면 다음 단계인 커널·DT·initramfs를 FIT 이미지 형태로 묶어 검증하면 됩니다.
[ROM 검증] -> [SPL 서명 OK] -> [SPL 검증] -> [U-Boot 서명 OK] -> [U-Boot 검증] -> [FIT 서명 OK] -> [Linux 부팅] 서명 실패 -> halt 또는 recoveryROM 단계는 SoC별로 다릅니다. NXP HABv4, TI HS, Rockchip BootROM 모두 형식이 제각각입니다. 하지만 U-Boot이 FIT를 검증하는 부분은 공통입니다. 이번 장은 그 공통 부분을 집중적으로 봅니다.
#RSA 키 쌍 만들기
가장 먼저 할 일은 빌드 서버에 보관할 private key를 만드는 것입니다. 양산 시스템에서는 HSM에 넣지만, 개발 단계에서는 파일 한 쌍으로도 충분합니다.
# 2048비트 RSA 키 생성mkdir -p keysopenssl genpkey -algorithm RSA -out keys/dev.key \ -pkeyopt rsa_keygen_bits:2048openssl req -batch -new -x509 -key keys/dev.key \ -out keys/dev.crtdev.key가 FIT 서명에, dev.crt가 public key 추출에 쓰입니다. 양산에서는 키 이름에 키 ID와 사용 환경을 넣어 두는 편이 안전합니다. prod-2026.key 같은 식으로 두면 키 회전 시점에 혼동이 줄어듭니다.
#FIT 이미지 구조와 signature 노드
FIT은 ITS(Image Tree Source) 파일로 기술하고 mkimage로 컴파일합니다. signature 노드는 어떤 키로 어떤 해시 알고리즘으로 서명할지를 적습니다.
/dts-v1/;
/ { description = "Signed FIT for boardX"; #address-cells = <1>;
images { kernel-1 { description = "Linux 6.6"; data = /incbin/("./Image"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "none"; load = <0x40080000>; entry = <0x40080000>; hash-1 { algo = "sha256"; }; };
fdt-1 { description = "board DT"; data = /incbin/("./board.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; hash-1 { algo = "sha256"; }; };
ramdisk-1 { description = "initramfs"; data = /incbin/("./initramfs.cpio.gz"); type = "ramdisk"; arch = "arm64"; os = "linux"; compression = "gzip"; hash-1 { algo = "sha256"; }; }; };
configurations { default = "conf-1"; conf-1 { description = "boardX boot"; kernel = "kernel-1"; fdt = "fdt-1"; ramdisk = "ramdisk-1"; signature-1 { algo = "sha256,rsa2048"; key-name-hint = "dev"; sign-images = "kernel", "fdt", "ramdisk"; }; }; };};signature-1이 configuration 단위로 묶여 있다는 점이 중요합니다. 커널 따로, DT 따로 서명하면 공격자가 서명된 두 묶음을 짝을 바꿔 끼우는 mix-and-match 공격이 가능합니다. configuration 단위 서명은 셋이 한 묶음임을 보장합니다.
#mkimage로 서명 굽기
mkimage -k는 private key로 FIT을 서명하고, -K u-boot.dtb는 동시에 U-Boot의 control DT에 public key를 박습니다.
mkimage -f boot.its \ -k keys \ -K u-boot.dtb \ -r \ -G keys/dev.key \ boot.itb옵션 의미는 이렇습니다.
-k keys—keys/dev.key·keys/dev.crt를 찾을 디렉터리-K u-boot.dtb— public key를 박을 control DT 파일-r— required 플래그를 박아 두어 U-Boot이 강제로 검증하게 함-G keys/dev.key— 서명에 쓸 private key (-k가 디렉터리,-G가 파일)
처음 실행하면 U-Boot DT의 /signature/key-dev 노드에 modulus·exponent가 들어갑니다. 이 DT를 빌드된 u-boot.bin에 다시 endorse(appended DT 또는 OF_EMBED 빌드)하면 끝입니다.
#U-Boot 측 설정
defconfig에 검증 기능을 켜야 합니다.
CONFIG_FIT=yCONFIG_FIT_SIGNATURE=yCONFIG_FIT_SIGNATURE_MAX_SIZE=0x10000000CONFIG_RSA=yCONFIG_RSA_VERIFY_WITH_PKEY=yCONFIG_OF_CONTROL=yCONFIG_OF_SEPARATE=yCONFIG_SHA256=yCONFIG_FIT_SIGNATURE=y가 들어가는 순간 U-Boot은 서명되지 않은 FIT을 거부합니다. 부팅 시 콘솔에 다음과 같은 줄이 보이면 정상입니다.
## Loading kernel from FIT Image at 40000000 ... Using 'conf-1' configuration Verifying Hash Integrity ... sha256,rsa2048:dev+ OK Trying 'kernel-1' kernel subimage Verifying Hash Integrity ... sha256+ OK+ OK가 핵심입니다. - Bad가 나오면 부팅이 중단됩니다.
#부팅 명령 흐름
서명 검증은 bootm(또는 booti·bootefi)이 자동으로 합니다. 따로 명령이 없습니다.
=> tftp 0x40000000 boot.itb=> bootm 0x40000000## Loading kernel from FIT Image at 40000000 ... Verifying Hash Integrity ... sha256,rsa2048:dev+ OK Loading kernel from 0x40000100 to 0x40080000 ...bootm이 verify 단계를 거치고, 실패 시 즉시 abort합니다. 잘 된 부팅과 서명 안 된 FIT 부팅을 한 번씩 시도해서 정말 거부되는지 확인해야 합니다. Verifying Hash Integrity ... error!가 떠야 정상입니다.
#anti-rollback
서명만 검증하면 유효한 서명이 박힌 옛 버전으로 되돌리는 rollback 공격이 가능합니다. anti-rollback은 최소 허용 버전을 OTP에 저장하고, 부팅 시 FIT의 버전 필드가 이 값 이상인지 확인합니다.
configurations { conf-1 { ... rollback-index = <0x00010005>; };};U-Boot의 fit_check_format()이 이 인덱스를 읽어 OTP 값과 비교합니다. OTP 갱신은 부팅 성공 후 일정 횟수가 지났을 때만 수행하는 것이 안전합니다. 한 번 잘못된 펌웨어를 받고 OTP를 올려 버리면 영영 되돌릴 수 없기 때문입니다.
#dm-verity와의 다리
FIT은 부팅 시점만 보호합니다. 부팅 후 rootfs가 바뀌면 모릅니다. 이 빈틈은 dm-verity가 막습니다. dm-verity는 rootfs 블록마다 Merkle tree hash를 계산해 두고, 커널이 블록을 읽을 때마다 hash를 검증합니다.
연결 지점은 커널 cmdline입니다.
root=/dev/dm-0 rootflags=ro \ dm-mod.create="root,,,ro,0 1234567 verity 1 \ /dev/mmcblk0p2 /dev/mmcblk0p3 4096 4096 \ 152340 1 sha256 <root-hash> <salt>"여기서 <root-hash>가 FIT에 함께 서명된 DT에 박힌 값이면, “FIT가 서명되어 있으니 cmdline도 안전, cmdline이 root-hash를 박고 있으니 rootfs도 안전”이라는 한 줄짜리 체인이 완성됩니다.
#FIT 구조 깊이 — .its source의 세 축
FIT은 세 종류의 노드가 한 트리에 모인 구조입니다. images에 바이너리가, configurations에 부팅 시 선택지가, 그리고 각 노드 안에 hash@N·signature@N 같은 무결성 메타가 들어갑니다. 이 세 축이 어떻게 맞물리는지 한눈에 정리합니다.
| 노드 | 역할 | 필수 필드 |
|---|---|---|
images/kernel@N | 부팅할 커널 바이너리 | data·type=kernel·arch·load·entry |
images/fdt@N | 보드 DT | data·type=flat_dt·arch |
images/ramdisk@N | initramfs | data·type=ramdisk·compression |
images/<n>/hash@N | 해당 image의 무결성 hash | algo (sha256 권장) |
configurations/conf@N | (kernel, fdt, ramdisk) 묶음 한 벌 | kernel·fdt·ramdisk 참조 |
configurations/conf@N/signature@N | configuration 단위 서명 | algo·key-name-hint·sign-images |
각 images/<n> 안의 hash@1은 그 image 한 덩어리의 해시입니다. configurations/conf@1/signature@1은 그 configuration이 묶고 있는 여러 image의 hash와 메타를 모두 한 번에 RSA로 서명합니다. 즉 hash는 각 조각, signature는 한 묶음이 단위입니다.
hash@1: sha256(image-data)signature@1: rsa2048( sha256( kernel.hash @ fdt.hash @ ramdisk.hash @ config-meta ) )이 구조이기 때문에 U-Boot은 두 단계로 검증합니다. 먼저 signature 검사로 hash 묶음이 변조되지 않았는지 보고, 그 다음 각 image의 hash 재계산으로 실제 데이터가 hash와 맞는지 봅니다. 둘 중 한 단계라도 깨지면 부팅이 끊깁니다.
#mkimage 서명 흐름 — public key가 control DTB로 들어가는 순간
mkimage는 한 번에 두 가지를 합니다. .itb를 만들면서 동시에 u-boot-dtb.dtb에 public key 노드를 추가합니다. 흐름을 단계별로 보겠습니다.
# 1) image-only .itb 생성 (서명 없음, 디버그용)mkimage -f myboard.its myboard.itb
# 2) 본 서명 + control DTB에 public key 임베드mkimage -f myboard.its \ -K u-boot-dtb.dtb \ -k ./keys \ -r \ myboard.itb-K u-boot-dtb.dtb가 핵심입니다. mkimage가 ./keys/dev.crt에서 modulus·exponent를 꺼내 control DTB의 /signature/key-dev 노드에 박습니다. 이 DTB가 U-Boot 바이너리에 합쳐지는 순간(OF_EMBED=y 빌드 또는 cat u-boot-nodtb.bin u-boot-dtb.dtb > u-boot.bin) public key가 코드와 한 덩어리가 됩니다.
key-dev { required = "conf"; algo = "sha256,rsa2048"; rsa,num-bits = <0x800>; rsa,modulus = [c0 8e 7a ... ]; rsa,exponent = <0x10001>; rsa,n0-inverse = <0xdeadbeef>; rsa,r-squared = <... >; key-name-hint = "dev";};required = "conf"가 configuration 노드를 검사할 때 이 키가 반드시 매치해야 한다는 표시입니다. -r 플래그가 없으면 required가 빠져 서명이 있어도 강제하지 않는 무용지물 상태가 됩니다.
#U-Boot bootm 시 verification 단계
bootm 0x40000000을 치는 순간 U-Boot 내부에서 다음 순서가 돌아갑니다. 코드는 boot/image-fit.c·boot/image-fit-sig.c에 있습니다.
1. fit_check_format() — magic·구조 검증
2. fit_conf_get_node() — 부팅할 conf@N 선택
3. fit_image_verify_required_sigs()
- ├ control DTB의 required key 목록 수집
- ├ conf@N/signature@N 노드와 매치
- └ 매치 실패 시 abort
4. fit_image_check_sig()
- ├ signed image 목록 (kernel·fdt·ramdisk)
- ├ region 데이터 모아 RSA verify
- └ Verifying Hash Integrity … sha256,rsa2048+ OK
5. fit_image_load(kernel)
- ├ image data 메모리에 복사
- └ hash@1 재계산 → Verifying Hash Integrity … sha256+ OK
6. fit_image_load(fdt) / fit_image_load(ramdisk) — 동일 절차
7. boot_jump_linux() — entry point로 점프
3·4단계가 configuration 서명 검증, 5·6단계가 각 image hash 검증입니다. 콘솔 로그에서 같은 “Verifying Hash Integrity”가 두 번 보이는 이유가 이것입니다.
## Loading kernel from FIT Image at 40000000 ... Using 'conf-1' configuration Verifying Hash Integrity ... sha256,rsa2048:dev+ OK <-- configuration sig Trying 'kernel-1' kernel subimage Verifying Hash Integrity ... sha256+ OK <-- image hash Loading kernel from 0x40000160 to 0x40080000## Loading fdt from FIT Image at 40000000 ... Trying 'fdt-1' fdt subimage Verifying Hash Integrity ... sha256+ OK#multi-config 서명 — 한 FIT, 여러 보드 변형
한 펌웨어 이미지로 여러 보드 변형을 지원해야 할 때가 있습니다. RAM 크기가 다른 두 SKU, 또는 RevA·RevB의 DT 차이를 한 묶음에 담는 식입니다. configurations 노드를 여러 개 두고 각 conf마다 따로 서명합니다.
configurations { default = "conf-revb";
conf-reva { description = "boardX Rev A (no PMIC)"; kernel = "kernel-1"; fdt = "fdt-reva"; ramdisk = "ramdisk-1"; signature-1 { algo = "sha256,rsa2048"; key-name-hint = "dev"; sign-images = "kernel", "fdt", "ramdisk"; }; };
conf-revb { description = "boardX Rev B (with PMIC)"; kernel = "kernel-1"; fdt = "fdt-revb"; ramdisk = "ramdisk-1"; signature-1 { algo = "sha256,rsa2048"; key-name-hint = "dev"; sign-images = "kernel", "fdt", "ramdisk"; }; };};부팅 시 적절한 conf를 고르려면 U-Boot 환경 변수 또는 board hook을 씁니다.
=> setenv board_rev revb=> setenv bootargs "...."=> bootm 0x40000000#conf-${board_rev}bootm <addr>#<conf-name>이 conf를 명시적으로 선택하는 문법입니다. 보드 코드에서 GPIO·EEPROM·OTP를 읽어 자동으로 board_rev를 결정하면 한 .itb로 두 SKU를 지원할 수 있습니다. 양쪽 conf 모두 서명되어 있으므로 어떤 변형을 골라도 신뢰 체인이 동일합니다.
#rollback protection — version 필드와 anti-rollback counter
서명만 검증하면 유효한 서명이 박힌 옛 버전으로 되돌리는 공격이 가능합니다. CVE 패치 직전 펌웨어가 그대로 서명되어 있으니, 공격자가 그것을 다시 깔면 끝입니다. 막는 방법은 FIT에 단조 증가 버전을 박고 OTP의 counter와 비교하는 것입니다.
/ { images { ... }; configurations { default = "conf-1"; conf-1 { kernel = "kernel-1"; fdt = "fdt-1"; rollback-index = <0x00010005>; /* 1.5 */ signature-1 { ... }; }; };};U-Boot 측에서 board hook이 OTP 또는 RPMB의 counter를 읽어 비교합니다.
int board_fit_image_post_process(void **p_image, size_t *p_size){ uint32_t fit_idx = fit_get_rollback_index(*p_image); uint32_t otp_min = otp_read_rollback_min(); if (fit_idx < otp_min) { printf("Rollback blocked: fit=%u otp_min=%u\n", fit_idx, otp_min); return -EPERM; } /* 부팅 성공이 충분히 확인된 후 별도 시점에 otp_min 갱신 */ return 0;}OTP 갱신은 부팅 성공 + 응용 동작 확인까지 끝난 뒤에 합니다. 부팅 직후에 올려 버리면 잘못된 펌웨어가 한 번 올라간 순간 모든 유효한 옛 버전이 영원히 차단됩니다. 보통 bootcount 메커니즘과 짝지어 N회 연속 부팅 성공 시에만 counter를 한 칸 올립니다.
#encryption + signature — 기밀성까지 추가
기본 verified boot은 무결성만 보장합니다. FIT의 내용은 평문이라 누구나 읽을 수 있습니다. 외주 SoC·재고 유출 위험이 있는 펌웨어는 AES로 한 겹 더 감싸 기밀성까지 챙깁니다. mkimage가 -e로 image별 암호화를 지원합니다.
images { kernel-1 { data = /incbin/("./Image"); type = "kernel"; cipher { algo = "aes256-gcm"; key-name-hint = "kek-2026"; iv-name-hint = "kernel-iv"; }; hash-1 { algo = "sha256"; }; };};mkimage -f myboard.its \ -E -k ./keys -K u-boot-dtb.dtb -r \ -G ./keys/sign.key \ myboard.itb키 관리에서 서명 키와 암호화 키를 분리하는 것이 원칙입니다.
| 키 종류 | 용도 | 임베드 위치 | 회전 정책 |
|---|---|---|---|
| Signing private (RSA) | FIT 서명 | HSM 또는 빌드 서버 격리 | 침해 시 즉시 |
| Signing public (RSA) | FIT 검증 | U-Boot control DTB | 펌웨어 업데이트로 |
| KEK (AES) | image 암호화 키 wrap | OTP 또는 secure enclave | OTP 1회성 |
| Image key (AES) | 실제 image 본문 암호화 | KEK로 감싼 채 FIT 안 | 빌드마다 새로 |
서명 키 침해와 암호화 키 침해는 피해 범위가 다릅니다. 서명 키가 깨지면 임의 펌웨어가 부팅 가능, 암호화 키가 깨지면 펌웨어 코드만 노출입니다. 분리해 두면 한쪽 회전이 다른 쪽에 영향을 안 줍니다.
#자주 하는 실수
서명 워크플로에서 자주 빠지는 함정 몇 가지를 모았습니다.
- private key를 git에 커밋한다. 양산 키는 HSM 또는 격리된 빌드 서버에만 둡니다. dev key라 하더라도 별도
keys/디렉터리를.gitignore로 막아야 합니다. - control DT에 public key를 박는 것과
u-boot.bin에 박는 것을 혼동한다.OF_EMBED=y면 DTB가 바이너리에 합쳐지지만,OF_SEPARATE=y면u-boot-dtb.bin처럼 합치는 단계를 거쳐야 합니다. -r플래그를 빼서 required 표시가 없는 키만 박는다. U-Boot은 required 키가 없으면 검증을 강제하지 않습니다. 결과는 “서명이 있어도 안 검증”입니다.- configuration 단위가 아닌 image 단위 서명으로 mix-and-match 가능 상태가 된다.
CONFIG_FIT_SIGNATURE_MAX_SIZE를 너무 작게 잡아 FIT 한 부분만 검증되고 나머지가 통과한다.- hash 알고리즘이 mismatch. .its는
sha1인데 U-Boot config는CONFIG_SHA256=y만 켜져 있으면Verifying Hash Integrity ... unsupported로 죽습니다. 새 시스템은 처음부터 sha256 이상으로 통일합니다. - private key 파일 permission이 group/other에 열려 있어 OpenSSL이
unable to load Private Key로 거부합니다.chmod 600 keys/*.key가 빌드 서버의 기본 위생입니다.
실패가 잡히는 증상과 원인을 한 표로 모았습니다.
| 증상 (콘솔 로그) | 가능한 원인 | 첫 점검 |
|---|---|---|
No FIT image format | 잘못된 주소·non-FIT 이미지 | iminfo로 magic 확인 |
Verification failed for required key | control DTB에 키가 없거나 required가 빠짐 | fdtdump u-boot-dtb.dtb | grep -A20 signature |
Verifying Hash Integrity ... error! (RSA verify 단계) | 서명 후 image 수정·잘못된 키 페어 | mkimage 재실행, public/private 일치 확인 |
Verifying Hash Integrity ... bad (image hash 단계) | image 본문 손상 또는 storage 오류 | image 다시 굽기, eMMC bad block 점검 |
unsupported hash algorithm | .its algo와 U-Boot config 불일치 | CONFIG_SHA256=y 등 활성화 |
Failed to verify required signature | sign-images에 빠진 image 존재 | .its의 sign-images 목록 점검 |
unable to load Private Key (mkimage 실행 중) | 키 파일 permission 또는 잘못된 PEM | chmod 600, OpenSSL로 키 형식 확인 |
#정리
- 신뢰 체인은 ROM에서 시작해 U-Boot이 FIT을 검증하는 곳에서 닫힙니다.
- RSA 키 쌍의 private key는 빌드 서버, public key는 U-Boot control DT에 박힙니다.
mkimage -k keys -K u-boot.dtb -G key.pem이 서명과 키 임베딩을 한 번에 수행합니다.- signature 노드는 configuration 단위로 둬야 mix-and-match 공격을 막을 수 있습니다.
CONFIG_FIT_SIGNATURE=y만 켜면 U-Boot이 부팅 시 자동으로 검증합니다.- anti-rollback 인덱스로 유효한 서명이 있는 옛 버전 공격을 막을 수 있습니다.
- 부팅 이후의 rootfs 무결성은 dm-verity가 받아 신뢰 체인을 이어 갑니다.
#다음 장 예고
서명만으로는 안전한 업데이트를 보장할 수 없습니다. 다음 장에서는 OTA 도중 전원이 끊겨도 살아남는 A/B 슬롯 구조와 bootcount·altbootcmd를 사용한 자동 fallback을 봅니다.
#관련 항목
- Ch 15: FIT 이미지 — 한 묶음으로 부팅하기 — 이번 장이 서명한 컨테이너 구조
- Ch 17: A/B 업데이트와 boot 이중화
- Ch 23: eFuse와 Root-of-Trust — 신뢰의 출발점이 되는 OTP 키 해시
- Ch 25: TF-A로 BL 단계별 서명 — BL1·BL2·BL31까지의 서명 흐름
- Ch 27: 전체 chain of trust 정리 — eFuse→BL→kernel까지의 큰 그림
- Embedded Security Ch 2: Secure Boot — ROM·SPL 측 시점에서 본 같은 체인
- 원문 — U-Boot doc/uImage.FIT/signature.txt
Bootloader Internals · 16 of 37
- 1ROM부터 init까지 — 임베디드 부팅 단계의 빈자리 분석
- 2Das U-Boot vs TF-A vs EDK II — 임베디드 부트로더 생태계 비교
- 3U-Boot 빌드 시스템 분석 — Kconfig·Makefile·defconfig 동작 추적
- 4ARM 임베디드 부트 4단계 분해 — BL1·SPL·TPL·U-Boot Proper의 역할
- 5U-Boot Falcon Mode — SPL이 U-Boot Proper 없이 커널 직접 부팅
- 6Device Tree DTB 부트로더 처리 — 로딩 시점과 fixup 메커니즘 추적
- 7U-Boot Driver Model 내부 — uclass·driver·device 추상화 구조
- 8U-Boot 보드 초기화 시퀀스 — board_init_f와 board_init_r 분리 이유
- 9DDR Controller 프로그래밍과 PHY Training — SPL의 가장 어려운 작업
- 10임베디드 스토리지 부팅 분석 — MMC·SCSI·NAND·SPI Flash 비교
- 11임베디드 네트워크 부팅 — TFTP·PXE·BOOTP 시퀀스 분석
- 12U-Boot USB 부팅 — fastboot·UMS·USB host 메커니즘
- 13U-Boot 환경 변수와 bootcmd — 부팅 시나리오 정의하기
- 14Modern U-Boot bootflow / bootmeth — 새 추상화 레이어 분석
- 15FIT image 구조 분석 — multi-image·hash·configuration 추적
- 16U-Boot Verified Boot — RSA 서명과 public key 임베딩 흐름
- 17임베디드 A/B 부팅 이중화 — OTA 안전성을 위한 부트 슬롯 설계
- 18U-Boot의 EFI 호환 분석 — bootefi 명령과 EFI loader 동작 원리
- 19Linux Boot ABI — ARM/ARM64 커널 진입 규약 추적
- 20임베디드 펌웨어 업데이트 — RAUC vs SWUpdate 비교
- 21새 보드 U-Boot 포팅 실전 — defconfig 작성부터 첫 부팅까지
- 22부트로더 디버깅 기법 — DEBUG·JTAG·serial·post-mortem 분석
- 23SoC BootROM·eFuse·OTP — 부팅의 0단계 분석
- 24SPL·TPL 내부 해부 — 가장 작은 부트 단계의 동작 추적
- 25ARM Trusted Firmware-A 통합 — BL1·BL2·BL31·BL32·BL33 흐름
- 26DDR Training과 PHY Calibration — 보드별 파라미터 튜닝
- 27임베디드 Chain of Trust — 다단계 서명 검증의 전체 흐름
- 28임베디드 Flash Layout 설계 — partition·NAND·eMMC·UBI 비교
- 29U-Boot Distro Boot — extlinux·boot.scr 표준화 분석
- 30부트로더 CI 구축 — build matrix와 자동 부팅 테스트
- 31TF-A BL31 EL3 Runtime 분석 — PSCI·SDEI·RAS dispatcher 추적
- 32PSCI와 SMCCC ABI — ARM 표준 SMC 호출 규약 분석
- 33ARM64 Secondary Core Bring-up — PSCI CPU_ON 호출부터 EL1 진입까지
- 34U-Boot PCIe Enumeration — 부트로더가 디바이스를 찾는 흐름 분석
- 35EFI·UEFI에서 CXL 초기화 — CEDT 생성과 HDM Decoder 사전 설정
- 36부트 시 메모리 토폴로지 결정 — DDR + CXL.mem 통합 인식
- 37UEFI Secure Boot 인증서 만료 — 2011→2023 CA 롤오버와 PQC 대비
관련 글
U-Boot PCIe Enumeration — 부트로더가 디바이스를 찾는 흐름 분석
U-Boot PCIe 열거 과정 — Root Complex 초기화·Config Space scan·BAR sizing·resource 할당, CXL DVSEC 인식까지.
U-Boot Distro Boot — extlinux·boot.scr 표준화 분석
보드별 다른 부트 스크립트를 표준화 — U-Boot Distro Boot, extlinux.conf, boot.scr의 차이와 선택.
SPL·TPL 내부 해부 — 가장 작은 부트 단계의 동작 추적
SPL과 TPL의 정확한 역할, SRAM 안에 들어가는 코드 구조, DDR이 없는 환경에서 어떻게 동작하는가.
이 글을 참조하는 글 (5)
- UEFI Secure Boot 인증서 만료 — 2011→2023 CA 롤오버와 PQC 대비— Bootloader Internals
- 임베디드 Chain of Trust — 다단계 서명 검증의 전체 흐름— Bootloader Internals
- 임베디드 A/B 부팅 이중화 — OTA 안전성을 위한 부트 슬롯 설계— Bootloader Internals
- FIT image 구조 분석 — multi-image·hash·configuration 추적— Bootloader Internals
- U-Boot Falcon Mode — SPL이 U-Boot Proper 없이 커널 직접 부팅— Bootloader Internals