Linux - Embedded Linux 개발의 부트로더

내장형 Linux 시스템은 거의 모두 부트로더를 포함하며 기술적으로 말하면 Linux의 일부는 아니지만 부트로더는 내장형 Linux 응용 프로그램의 핵심 부분입니다.

재설정 후 임베디드 시스템에서 Linux 커널 실행을 시작하는 것이 이론적으로나 기술적으로 가능하지만 일반적으로 수행되지 않습니다. 내장형 시스템은 일반적으로 운영 체제의 초기 부팅 코드 및 POST(Power On Self Test) 실행에 대한 책임을 별도의 부트로더로 분리합니다.

임베디드 시스템의 전원이 켜지면 CPU는 부트로더라고 하는 초기화 코드를 실행합니다. 부트로더는 필요한 하드웨어를 초기화한 다음 실행할 다음 프로그램을 찾고 해당 프로그램을 메모리에 로드한 다음 실행을 위해 해당 프로그램으로 이동합니다. 이 시점부터 부트로더 코드는 더 이상 실행되지 않으므로 메모리에서 제거됩니다.

실행할 다음 프로그램은 무엇이든 될 수 있습니다. 부트로더가 다음 부트로더를 로드한 다음 다른 부트로더를 로드하는 것은 드문 일이 아닙니다. 그러나 어쨌든 사용 가능한 시스템을 얻으려면 운영 체제 코드, 대부분 Linux 커널을 로드하게 됩니다. 간단한 시스템은 CPU 재설정 후 부트로더를 실행한 다음 운영 체제를 로드하고 실행합니다.

커널을 직접 실행하는 대신 별도의 부트로더를 사용하면 유연성이 제공되므로 커널을 메모리의 다른 위치에 배치하여 부트로더가 찾아서 로드할 수 있습니다. 이와 같이 부트로더에 서로 다른 구성을 저장함으로써 임베디드 시스템의 초기 개발부터 양산까지 동일한 부트로더를 사용할 수 있다. 예를 들어, 초기 개발 단계에서 임베디드 플랫폼은 전적으로 네트워크에서 부팅할 수 있고, 이후 개발 단계에서는 SD 카드에서 부팅할 수 있으며, 생산 시스템은 NAND 플래시에서 부팅할 수 있습니다.

하드웨어의 다양한 구성을 파라미터 형태로 커널에 전달할 수 있으므로 동일한 플랫폼을 기반으로 하는 서로 다른 임베디드 하드웨어 시스템, 즉 아키텍처는 같지만 하드웨어 구성이 다른 장치가 동일한 커널 바이너리 파일을 사용할 수 있습니다.

부트로더는 모든 모양과 크기로 제공됩니다. 부트로더에서 원하는 것은 간단하고 사용자 정의가 가능하며 일반적인 개발 보드 및 장치에 대한 많은 예제 구성이 있다는 것입니다. 다음 표는 일반적으로 사용되는 몇 가지 부트로더를 보여줍니다.

이름

지원되는 주요 아키텍처

잠수함

ARC, ARM, Blackfin, Microblaze, MIPS, Nios2, OpenRiec, PowerPC, SH

베어박스

ARM, 블랙핀, MIPS, Nios2, PowerPC

그럽 2

X86, X86_64

작은 커널

레드부트

팔, MIPS, PowerPC, SH

CFE

브로드컴 MIPS

나쁜

밉스

U-부트

임베디드 Linux 시스템에서 가장 일반적인 부트 프로그램은 U-Boot입니다. U-Boot의 공식 명칭은 Das U-Boot이지만 모두가 U-Boot라고 부릅니다. 68k, ARM, MicroBlaze, MIPS, Nios, SuperH, PPC, RISC-V, x86 등 많은 프로세서(CPU) 아키텍처를 지원합니다. 또한 많은 코드를 포함하고 있으며 많은 기존 임베디드 개발 보드를 지원합니다.

U-Boot는 오픈 소스 부트로더입니다. 맞춤형 임베디드 시스템의 경우 특정 하드웨어를 지원하도록 U-Boot의 코드를 수정할 수 있습니다.

U-Boot에는 또한 많은 드라이버가 있으므로 다양한 위치에서 커널을 찾을 수 있습니다. U-Boot에는 FTP, NAND 플래시 메모리, MMC, i2c 및 기타 드라이버가 있습니다. 또한 FAT, ext2/3/4, Cramfs, Squashfs, JFFS2, UBIF, ZFS, btrfs 등과 같은 파일 시스템 드라이버도 포함합니다. 이는 다른 미디어와 다른 파일 시스템에서 U-Boot가 저장된 커널 바이너리 파일을 찾을 수 있음을 의미합니다.

U-Boot의 시작 구성은 환경 변수의 형태로 저장됩니다. U-Boot는 일반적으로 이러한 환경 변수를 플래시 메모리에 저장하며 해당 값은 재부팅 후에도 지속될 수 있습니다. U-Boot가 실행되면 "bootcmd"라는 환경 변수를 찾습니다. 그런 다음 U-Boot는 이 변수를 확장하고 그 안에 있는 모든 명령을 실행합니다.

U-Boot에는 명령줄에 대한 Unix와 유사한 구문이 포함되어 있습니다. 이 명령줄 환경에서 환경 변수를 수정하고 플래시에 새 값을 저장하여 후속 부팅에 사용할 수 있습니다.

실제로 초기 개발에서 구성을 위해 U-Boot를 사용할 수 있습니다. 예를 들어 NFS를 루트 파일 시스템으로 사용하여 TFTP를 통해 커널을 부팅하도록 구성합니다. 그런 다음 소프트웨어 릴리스가 가까워지면 MMC를 통해 ext4를 사용하여 SD 카드에서 부팅하도록 변경할 수 있습니다. 생산에 가까워지면 UBIFS를 사용하여 보드 내부의 NAND 플래시에서 부팅하도록 U-Boot를 변경할 수 있습니다.

U-Boot의 또 다른 중요한 기능은 장치 트리 지원입니다. 장치 트리는 Linux 커널에서 하드웨어를 설명하는 비교적 새로운 방법입니다. 임베디드 시스템에는 런타임 검색 가능한 하드웨어가 거의 없습니다. 커널은 하드웨어 쿼리를 통해 사용 가능한 새 하드웨어를 찾을 수 없습니다. 어떤 장치나 하드웨어가 있는지 커널에 알려야 합니다. 하드웨어 정보를 코드에 하드코딩하는 대신 커널은 하드웨어를 설명하는 장치 트리를 읽고 적절한 드라이버를 로드할 수 있습니다. 이를 통해 동일한 아키텍처를 기반으로 하는 서로 다른 보드에서 동일한 커널 바이너리를 실행할 수 있습니다.

아시다시피 U-Boot는 장치 및 파일 시스템에 대한 광범위한 지원과 유연성으로 인해 임베디드 시스템을 위한 일반적인 선택입니다. U-Boot에 대한 자세한 정보를 얻으려면 프로젝트 웹사이트를 방문하십시오: The U-Boot Documentation — Das U-Boot unknown version documentation

기타 부트로더

U-Boot가 가장 일반적으로 사용되지만 다른 부트로더도 임베디드 시스템에서 사용할 수 있습니다. 가능한 모든 부트로더를 다루기에는 너무 많은 공간이 있지만 몇 가지 다른 일반적인 오픈 소스 부트로더가 도입될 것입니다.

Barebox는 U-Boot를 기반으로 개발되었습니다. U-Boot와 같은 유연성을 많이 가지고 있지만 Linux에 더 가까워지기 위해 노력합니다. 내부 파일 시스템 사용 및 파일 시스템 내 /dev의 장치 노드 사용을 포함하여 Linux 커널과 유사한 드라이버 아키텍처를 사용합니다. URL: 베어박스  .

RedBoot는 Red Hat용 부트로더입니다. 내부적으로 eCos RTOS 기술을 사용하며 디버거를 제공하며 디버거는 직렬 포트 또는 이더넷을 사용합니다.

참고:

1. 부트로더 선택 방법

부트로더 선택 - 임베디드 리눅스 프로그래밍 마스터링 - 제2판 [도서]

2. 임베디드 부트로더 제공

임베디드 Linux 시스템용 부트로더 - 새로운 스택

추천

출처blog.csdn.net/guoqx/article/details/130986258