[Linux] U-boot 가 리눅스 커널을 로드하는 구체적인 과정 정리(1)

2025. 10. 30. 23:34·Embedded Systems/리눅스

리눅스 부팅시, 부트로더는 구체적으로 어떤 절차를 거쳐 메모리에 리눅스 커널을 로드하는 건지 알아보았다.

 

실행되는 파일로 구분해본 리눅스 부팅과정 flow-chart

Control Flow during Linux booting

  1. U-boot가 리눅스의 bootstrap loader에 있는 `head.s` 파일에게 제어를 넘긴다.
  2. `head.s`는 압축된 커널 이미지의 압축 해제를 위해, 같은 bootstrap loader에 위치한 `misc.c` 파일을 호출한다.
  3. 다음으로 제어권은 리눅스 커널에 위치한 또다른 `head.s`파일로 넘어간다.
  4. 제어권은 `head-common.c` 파일을 거쳐, 리눅스 커널의 `main.c` 파일로 넘어간다.
  5. `main.c` 로부터, 리눅스 커널의 첫번째 appliction인 `init`이 실행된다!

U-boot(bootloader)가 linux bootstrap에게 제어권을 넘기는 구체적인 코드

(https://ftp.denx.de/pub/u-boot/ 페이지에서 u-boot 소스코드를 다운받을 수 있다.)

 

위 링크에서 받을 수 있는 u-boot의 "arch/arm/lib/"에 위치한 bootm.c 코드는 저장장치에 저장된 리눅스 커널을 read하여 체크썸 검증을 수행하고, control을 넘겨주는 기능을 구현한 소스코드이다.

 

구체적으로, bootm.c 소스코드의 `boot_jump_linux()` 함수 동작을 살펴보면,

다음과 같이 kernel_entry 라는 함수 포인터에 "images" 구조체의 "ep" 멤버를 저장한다.

여기서 ep는 entry point를 의미한다. 다시말해, 이 kernel_entry 포인터는 linux entry point address에 존재하는 함수를 가리키는 것이다. 

 

여기서 linux entry point address란,

다음 그림과 같이 uImage에서 image header을 제외한 linux kernel의 메모리상의 실제 시작 위치를 말한다.

 

계속해서 bootm.c 코드를 살펴보면, 

이어서 다음과 같이, unsigned long 자료형 변수 "r2"에 ft_addr의 주소를 저장한다.

ft_addr은 device tree binary가 위치하는 RAM의 주소이다.

이 device tree binary(dtb)는 보드에 존재하는 다양한 페리펄럴들을 정의하는 역할을 한다.

 

이후, 함수의 마지막 부근에서,

다음과 같이 앞서 정의했던 kernel_entry 포인터에 저장된 images->ep 에 저장된 함수를 실행해, 리눅스 커널 bootstrap loader의 head.s 파일을 호출하며, U-boot에서 linux kernel bootstrap loader로 제어권을 넘기게된다.

여기서 함수 argument를 설명하면

    0 : linux에 의해 무시되는 arugment

    machid : u-boot에 의해 감지되는 보드의 "machine id". register r1에 의해 리눅스에게 전달된다.

    r2 : device tree binary가 저장된 address. register r2에 의해 리눅스에게 전달된다.

요렇게, u-boot의 bootm.c 소스코드의 boot_jump_linux() 함수를 통해 U-boot bootloader로부터 linux bootstrap loader로 제어권이 넘어간다.

'Embedded Systems > 리눅스' 카테고리의 다른 글

[Linux] 임베디드 리눅스 부팅 타임 최적화  (0) 2025.11.19
[Linux] BBB Linux boot time 최적화 #0  (0) 2025.11.04
[Linux] 임베디드 리눅스 부팅 순서 + 비글본 블랙(BBB) 부팅 순서  (0) 2025.10.28
[Linux] 디바이스 드라이버란 무엇일까?  (0) 2025.10.27
[Linux] 리눅스의 프로그래밍 도구 (GCC, make, gdb 유틸리티)  (0) 2025.10.27
'Embedded Systems/리눅스' 카테고리의 다른 글
  • [Linux] 임베디드 리눅스 부팅 타임 최적화
  • [Linux] BBB Linux boot time 최적화 #0
  • [Linux] 임베디드 리눅스 부팅 순서 + 비글본 블랙(BBB) 부팅 순서
  • [Linux] 디바이스 드라이버란 무엇일까?
jh-rrr
jh-rrr
기술의 깊이에 집중하며 성장하길 지향합니다.
  • jh-rrr
    Embedded World
    jh-rrr
  • 전체
    오늘
    어제
    • 분류 전체보기 (64)
      • 소프트웨어 (17)
        • 프로그래밍 (2)
        • C (10)
        • Python (1)
        • 운영체제 (3)
        • 네트워크 (0)
      • Embedded Systems (16)
        • 리눅스 (10)
        • MCU 기본 (2)
        • 임베디드 레시피 (0)
      • Projects (1)
        • Cortex-M3 (1)
        • 재난 구조 로봇 (0)
      • AI (11)
        • Computer Vision (2)
        • Deep Learning (3)
        • cs224n (2)
        • cs231n (2)
      • 취업 준비 (0)
        • 프로젝트 & 자격증 (1)
      • 엔지니어링 뉴스 (3)
      • Paper Reviews (4)
      • Insights (8)
        • Seminar ! (2)
        • 서평 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    conda: command not found
    리눅스 오류
    OS 이미지
    kernel image 란
    stm32f 시리즈를 이용한 arm cortex-m3/m4 구조와 응용
    리눅스
    essential deep learning paper reading
    커널 이미지
    일귀
    커널 이미지란
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jh-rrr
[Linux] U-boot 가 리눅스 커널을 로드하는 구체적인 과정 정리(1)
상단으로

티스토리툴바