Das U-Boot

**Das U-Boot**(부제: "범용 부트로더", the Universal Boot Loader, **U-Boot**로 줄여 부름, 이름에 대한 자세한 내용은 역사 참조)는 임베디드 기기에서 다양한 저수준 하드웨어 초기화 작업을 수행하고 기기의 운영 체제 커널을 부팅하는 데 사용되는 오픈 소스 부트로더이다. M68000, ARM, 블랙핀, MicroBlaze, AArch64, MIPS, 니오스 II, 슈퍼H, PPC, Power ISA, RISC-V, LoongArch 및 x86을 포함한 여러 컴퓨터 구조에서 사용할 수 있다.

## 기능
U-Boot는 1단계 및 2단계 부트로더이다. 이 부트로더는 시스템의 ROM(예: ARM CPU의 온칩 ROM)에 의해 SD 카드, SATA 드라이브, NOR 플래시(예: SPI 또는 I²C 사용), 또는 NAND 플래시와 같은 지원되는 부팅 장치에서 로드된다. 크기 제약이 있는 경우 U-Boot는 두 단계로 나뉠 수 있다. 플랫폼은 U-Boot의 간소화된 버전인 작은 SPL(Secondary Program Loader)을 로드하고, SPL은 일부 초기 하드웨어 구성(예: RAM으로 CPU 캐시를 사용하여 DRAM 초기화)을 수행하고 더 크고 완전히 기능을 갖춘 U-Boot 버전을 로드한다. SPL 사용 여부와 관계없이 U-Boot는 1단계(예: 메모리 컨트롤러, SDRAM, 메인보드 및 기타 I/O 장치 구성) 및 2단계 부팅(예: OS 커널 및 기타 관련 파일을 저장 장치에서 로드)을 모두 수행한다.

U-Boot는 Embedded Base Boot Requirements (EBBR) 사양에 정의된 UEFI 사양의 하위 집합을 구현한다. GRUB 또는 리눅스 커널과 같은 UEFI 바이너리는 부팅 관리자를 통해 또는 명령줄 인터페이스에서 부팅될 수 있다.

U-Boot는 콘솔 또는 직렬 포트에서 명령줄 인터페이스를 실행한다. CLI를 사용하여 사용자는 커널을 로드하고 부팅할 수 있으며, 필요에 따라 기본값을 변경할 수 있다. 또한 장치 정보를 읽고, 플래시 메모리를 읽고 쓰고, 직렬 포트 또는 네트워크에서 파일(커널, 부팅 이미지 등)을 다운로드하고, 장치 트리를 조작하고, 환경 변수(영구 저장 장치에 기록될 수 있으며, 기본 부팅 명령 및 자동 부팅 전 시간 초과, 이더넷 MAC 주소와 같은 하드웨어 데이터를 포함하여 U-Boot 동작을 제어하는 데 사용됨)와 함께 작업하는 명령도 있다.

커널 및 기타 부팅 데이터의 메모리 위치를 모호하게 하거나 자동으로 선택하는 PC 부트로더와 달리, U-Boot는 부팅 명령에서 데이터(커널, 램디스크, 장치 트리 등)를 복사할 대상 및 커널로 점프할 대상의 물리적 메모리 주소를 명시적으로 지정하고 커널의 인수로 지정해야 한다. U-Boot의 명령은 상당히 저수준이기 때문에 커널을 부팅하는 데 여러 단계가 필요하지만, 동일한 명령이 더 일반적인 작업에 사용될 수 있으므로 다른 부트로더보다 U-Boot가 더 유연하다. U-Boot를 사용하여 U-Boot 자체를 업그레이드하는 것도 가능하다. 단순히 새로운 부트로더를 어딘가(로컬 저장소, 직렬 포트 또는 네트워크)에서 메모리로 읽어들인 다음, 부트로더가 있는 영구 저장 장치에 해당 데이터를 기록하면 된다.

U-Boot는 USB를 지원하므로 USB 키보드를 사용하여 콘솔을 작동할 수 있으며(직렬 포트 입력 외에), SD 카드 리더기와 같은 USB 대용량 저장 장치에 액세스하고 부팅할 수 있다.

### 데이터 저장 및 부팅 소스
U-Boot는 커널 및 기타 필요한 데이터(예: 장치 트리, 램디스크 이미지 또는 부팅 이미지)를 메모리로 읽어 들인 다음, 적절한 인수로 커널을 실행하여 운영 체제를 부팅한다.

U-Boot의 명령은 실제로 임의의 데이터를 읽거나 쓰는 데 사용할 수 있는 일반화된 명령이다. 이러한 명령을 사용하여 U-Boot가 지원하는 모든 저장 시스템에서 데이터를 읽거나 쓸 수 있다. 지원되는 저장 시스템은 다음과 같다.

(참고: 다음은 U-Boot가 데이터를 (예: 커널 또는 램디스크 이미지) 메모리로 로드할 수 있는 부팅 소스이다. U-Boot 자체는 플랫폼에 의해 부팅되어야 하며, 이는 플랫폼의 ROM이 부팅할 수 있는 장치에서 수행되어야 하는데, 이는 당연히 플랫폼에 따라 달라진다.)
* 온보드 또는 연결된 저장 장치
** SD 카드
** SATA
** SCSI
** I²C (예: EEPROM 또는 NOR 플래시)
** SPI (예: NOR 또는 NAND 플래시)
** ONFI (원시 NAND 플래시)
** eMMC (관리형 NOR 또는 NAND 플래시)
** eUFS (관리형 NAND 플래시)
** NVMe
** USB 대용량 저장 장치
* 직렬 포트 (파일 전송)
** 커밋
** S-레코드
** YMODEM
* 네트워크 부팅 (선택적으로 DHCP, BOOTP 또는 RARP 사용)
** TFTP
** NFS

일부 임베디드 장치 구현에서 CPU 또는 SoC는 부팅 파티션(ext4 또는 FAT 파일 시스템 등)에서 부트로더(Das U-Boot 등)를 직접 찾아 로드한다.

### 호환되는 파일 시스템
U-Boot는 커널이 이를 루트 파일 시스템 또는 초기 램디스크로 사용하기 위해 파일 시스템을 읽을 수 있을 필요는 없다. U-Boot는 단순히 커널에 적절한 매개변수를 제공하고/하거나 내용을 이해하지 않고 데이터를 메모리에 복사한다.

그러나 U-Boot는 파일 시스템에서 읽을 수도 있고(일부 경우에는 쓸 수도 있다). 이런 방식으로 U-Boot가 로드할 데이터를 저장 장치의 고정된 위치에 저장할 것을 요구하는 대신, U-Boot는 파일 시스템을 읽어 경로 이름으로 커널, 장치 트리 등을 검색하고 로드할 수 있다.

U-Boot는 다음 파일 시스템을 지원한다.

* btrfs
* CBFS (코어부트 파일 시스템)
* Cramfs
* ext2
* ext3
* ext4
* F2FS
* FAT
* FDOS
* JFFS2
* ReiserFS
* Squashfs
* UBIFS
* ZFS

### 장치 트리

장치 트리는 하드웨어 레이아웃을 설명하는 데이터 구조이다. 장치 트리를 사용하면 공급업체는 특수 목적 하드웨어에서도 덜 수정된 메인라인 U-Boot를 사용할 수 있다. 리눅스 커널에서도 채택되었듯이, 장치 트리는 임베디드 산업에서 제품별 포크(U-Boot 및 리눅스)가 엄청나게 많은 상황을 개선하기 위한 것이다. 메인라인 소프트웨어를 실행할 수 있다는 것은 고객에게 공급업체 업데이트 부족에 대한 보상을 실질적으로 제공한다.

## 역사
[섬네일|[Neo FreeRunner|Openmoko Freerunner에서 실행 중인 U-Boot]]
섬네일|XPedite5501에서 실행 중인 U-Boot

이 프로젝트는 마그누스 담(Magnus Damm)이 작성한 **8xxROM**이라는 8xx 파워PC 부트로더로 시작되었다. 1999년 10월, 볼프강 덴크(Wolfgang Denk)는 프로젝트를 SourceForge.net으로 옮기고 SF.net에서 숫자로 시작하는 프로젝트 이름을 허용하지 않았기 때문에 **PPCBoot**으로 이름을 변경했다. PPCBoot 버전 0.4.1은 2000년 7월 19일에 처음으로 공개되었다.

2002년에는 이전 버전의 소스 코드가 **ARMBoot**이라는 제품으로 잠시 포크되었지만, 얼마 지나지 않아 PPCBoot 프로젝트로 다시 병합되었다. 2002년 10월 31일에는 **PPCBoot−2.0.0**이 출시되었다. 이는 PPC ISA 외의 다른 아키텍처에서도 작동할 수 있도록 이름을 변경했기 때문에 PPCBoot라는 이름으로 출시된 마지막 버전이다.

PPCBoot−2.0.0은 2002년 11월에 **U−Boot−0.1.0**이 되었고, x86 프로세서 아키텍처에서도 작동하도록 확장되었다. 이후 몇 달 동안 추가 아키텍처 기능이 추가되었다. 2003년 3월에는 MIPS32, 4월에는 MIPS64, 10월에는 니오스 II, 12월에는 ColdFire, 2004년 4월에는 MicroBlaze가 추가되었다. 2004년 5월에 출시된 U-Boot-1.1.2는 다양한 아키텍처를 아우르는 216개 보드 제조업체의 제품에서 작동했다.

현재 이름인 **Das U-Boot**은 독일어 정관사를 추가하여, 제2차 세계 대전 독일 U보트를 배경으로 한 1981년 고전 독일 잠수함 영화 Das Boot에 대한 이중 언어 말장난을 만들었다. 이 소프트웨어는 GNU 일반 공중 사용 허가서 조건에 따라 자유 소프트웨어로 출시된다. 이는 예를 들어 crosstool, Embedded Linux Development Kit (ELDK) 또는 OSELAS.Toolchain과 같은 크로스 개발 GNU 툴체인을 사용하여 의도된 모든 아키텍처를 위해 x86 PC에서 빌드할 수 있다.

임베디드 리눅스 시스템에서 U-Boot의 중요성은 카림 야그무르(Karim Yaghmour)의 저서 『Building Embedded Linux Systems』에서 간결하게 언급되어 있다. 이 책은 U-Boot에 대해 "다른 많은 부트로더가 있지만, 범용 부트로더인 'Das U-Boot'는 단연코 가장 풍부하고 유연하며 가장 활발하게 개발되는 오픈 소스 부트로더이다."라고 시작한다.

## 주목할 만한 취약점

2025년에 2024년에 발견된 U-Boot의 여러 취약점이 공개되었다. 파일 시스템 데이터 구조를 수동으로 수정하여 U-Boot의 파일 시스템 지원 기능(ext4, SquashFS)을 악용하면 공격자는 정수 오버플로, 스택 오버플로 또는 힙 오버플로를 유발할 수 있다. 결과적으로 공격자는 임의 코드 실행을 수행하고 부팅 신뢰 체인을 우회할 수 있다. 이러한 문제는 v2025.01-rc1 버전에서 완화되었다.

## 사용처
* ARM 기반 크롬북에는 U-Boot가 탑재되어 있다. 셀러론 및 i5 기반 크롬북은 U-Boot를 코어부트의 페이로드로 사용한다.
* 파워PC 기반 아미가원 컴퓨터 시리즈는 아미가OS를 실행하며 U-Boot를 사용한다. 특히 ACube Systems Srl의 Sam440ep 및 Sam460ex와 AmigaOne X1000의 후속작인 A-Eon의 AmigaOne X5000에서 사용된다.
* Ubiquiti Networks 장치는 U-Boot를 사용한다.
* 아마존 킨들 및 Kobo eReader 장치는 U-Boot를 부트로더로 사용한다.
* TP-Link 및 기타 OpenWRT/LEDE 호환 MIPS 기반 무선 라우터는 부팅을 위해 U-Boot를 사용한다.
* Teltonika 셀룰러 라우터는 U-Boot 기반의 부트로더를 사용한다.
* SpaceX의 팔콘과 드래곤 모두 U-Boot를 사용한다.
* 아사히 리눅스는 애플 실리콘 맥에서 리눅스를 부팅하기 위해 m1n1의 페이로드로 U-Boot를 사용한다.

## 같이 보기
* 부트로더 비교
* RedBoot
* 코어부트
* Barebox

## 내용주

## 각주

## 외부 링크
* 
* 
* Barebox (이전 이름: U-Boot-V2)
* 

분류:펌웨어
분류:C로 작성된 자유 소프트웨어