Embedded SW 기초

임베디드 리눅스 부팅 절차

뜨요르 2024. 6. 10. 21:02

임베디드란 메모리 등의 자원이 한정되어 있는 장치로 작은 컴퓨터라 볼 수 있다.

그렇다면 컴퓨터에 전원 버튼을 누르면 어떻게 동작하는지 아는가? 이번 글은 임베디드 리눅스 부팅 절차를 설명해 보려고 한다.

ROM -> SPL -> U-Boot -> Kernel

임베디드에서 power 버튼을 누르면 부트롬이 실행된다.

  • 부트롬 이란?

리셋이나 전원을 켠 직후에 실행되는 SoC의 칩상에 저장된 코드로 메모리 컨트롤러가 필요 없는 SRAM만 사용이 가능하며 이 안에는 부트로더를 실행할 수 있는 부트로더 메모리 정보가 담겨있다.

부트롬에서 부트로더를 실행할 수 있는 메모리로 이동하게 된다.

  • 부트로더란?

커널로 제어 넘길 때 보내주는 기본 정보로 장치 트리가 지원되지 않는 파워 PC와 ARM 플랫폼에서 SoC의 종류를 식별하기 위해 사용하는 기계번호이다. 부트로더는 2개 일 수 있다. 

  • SPL(Secondary Program Loader)

SPL은 디바이스 벤더 부트로더라고 말할 수 있으며 이는 필수는 아니다.

일반적으로 SRAM이 U-Boot과 같은 전체 부트로더를 로드하기에 충분히 크지 않기 때문에 보조 프로그램 로더가 있어야 한다.

SPL은 TPL을 주 메모리(DRAM)에 로드하도록 메모리 컨트롤러 및 기타 빌 수 부분의 초기화를 수행한다.

  • TPL(Tertiary Program Loader)

U-Boot과 같은 완전한 부트로더 실행 단계이다.

새로운 부트/커널 이미지를 플래시 저장소에 로드하고, 커널 로드와 부팅하는 등의 유지 관리 작업을 수행한다. 사용자의 개입 없이 커널을 자동으로 로드하며 TCL이 끝나면 커널이 메모리에서 시자괴길 기다리고 있다가 커널이 실행되면 부트로더는 일반적으로 메모리에서 사라지고 시스템 작동에 더 이상 참여하지 않는다.

  • Kernel 실행

비로소 커널이 실행되고 시스템의 제어권을 갖는다. 이때까지의 리눅스 임베디드에선 Bring-Up 작업이라고 한다.

 

참고 : https://makersweb.net/embedded/15562#google_vignette

장치 트리(Device Tree)란?

Device Tree

 

보드의 핀은 GPIO로 기본값이 설정되어 있다. 이 핀을 I2C, UART, PCI 등의 다른 통신의 핀으로 바꿔주는 작업을 Pin Mux라고 한다. 이 Pin Mux의 핀을 바꿔줄 때 통신을 정의한 정의서이다.

부트로더가 로드하여 커널에 넘기거나 커널 이미지 자체에 포함시킬 수 있다. 컴퓨터 시스템을 Tree 같은 계층구조로 결합된 요소의 묶음으로 나타낸다. Device Tree의 확장자는 *.dts이고 (device tree src 파일) 이 파일들을 binary파일로 커널에 올려야 하기 때문에 *.dtb (device tree binary 파일)로 변환한다.

아래는 imx8mq 보드의 yocto에 커널에서 arch/arm64/boot/dts/freescale시 많은 dts파일인데 그중 하나의 dts파일만 사용한다.