리눅스 시스템 구조와 부트 과정 이해(4) - Bootloader

2025. 5. 3. 23:25·Linux/Embedded Linux

앞선 게시글을 통해, 임베디드 리눅스 시스템에서 사용자 영역의 C 코드가 시스템 콜을 통해 커널 영역에 접근하고, 이를 통해 실제 하드웨어 자원(UART, GPIO 등)에 접근하는 흐름에 대해 대략적으로 이해했을 것이다.

 

이제 다시 근본적인 질문으로 돌아가 보자. 이렇게 동작하는 커널 시스템은 과연 어떻게 시스템에 로드되고, 우리가 작성한 C 코드가 이를 통해 하드웨어에 접근할 수 있게 되는 걸까? 큰 흐름을 살펴보자면 아래와 같다.

  1. Power On
    시스템이 처음 켜질 때 전원이 공급됨
    이 단계에서 아무것도 로딩된 상태가 아님 (빈 CPU)

  2. ROM Code (SoC 내부 Boot ROM)
    CPU에 하드코딩된 고정 펌웨어 코드
    제조사가 칩 내부에 구워놓은 코드로, 보통 ROM에 저장됨
    Booting device(SD, eMMC, NAND 등) 탐색
    부트로더의 위치 확인
    부트로더를 RAM으로 로딩하여 실행
    !!!!! 이 단계는 수정할 수 없음. SoC 제조사가 미리 정의

  3. Booting Device 탐색
    ROM 코드가 미리 정의된 순서에 따라 부팅 장치를 찾음
    (eMMC → SD → USB → SPI NOR Flash)
    부트로더가 포함된 장치를 찾으면, 해당 섹터에서 부트로더 이미지를 메모리로 로딩

  4.  Bootloader (U-Boot, Barebox, UEFI)
    여기서부터 사용자가 수정 가능
    RAM, 스택, 디바이스 트리 설정
    메모리 초기화 (Memory Init)
    커널 이미지(zImage 또는 uImage) 로딩
    !!!!!  이게 없다면 커널은 "내가 어디서 부팅됐는지, RAM 어디를 써야 하는지" 몰라서 실행 불가

  5. Kernel
    시스템의 뇌 역할
    모든 드라이버 초기화
    파일 시스템 마운트
    메모리/프로세스/디바이스 관리

  6. Platform (User Space, Application)
    실제 우리가 다루는 사용자 프로그램들이 실행되는 영역
    Shell, UART 프로그램, GUI 등
    여기부터 시스템 콜을 통해 커널과 통신 시작됨

우리가 라즈베리 파이를 맨 처음 설치할 때에 sd 카드에 부팅 디바이스를 설치하고 여기에 부트로더가 설치된다. 이를 실제로 확인해보자.

SD 카드의 부트 파티션(Windows에서 보이는 파일들)과 라즈베리파이에서 /boot/firmware로 마운트된 내용이 완벽히 일치함을 실제로 확인할 수 있다.

 

이를 다시 정리하자면,


1. 라즈베리파이 전원 인가
2. SoC 내부의 ROM 코드가 실행됨
3. SD 카드의 첫 번째 파티션(FAT32)을 읽음
4. bootcode.bin → start.elf 실행
5. config.txt, cmdline.txt 읽어서 설정 반영
6. kernel*.img 로딩하여 ARM CPU 부팅 시작

각 파일들의 역할은 위와 같다.

'Linux > Embedded Linux' 카테고리의 다른 글

센서 제어 및 인터페이스 (1) - 라즈베리파이 4 vs 라즈베리파이5  (0) 2025.05.04
리눅스 시스템 구조와 부트 과정 이해(5) - 디바이스 트리  (0) 2025.05.04
리눅스 시스템 구조와 부트 과정 이해(3) - 시스템 콜  (0) 2025.05.03
리눅스 시스템 구조와 부트 과정 이해(2) - 임베디드 리눅스에서의 UART  (0) 2025.05.03
리눅스 시스템 구조와 부트 과정 이해(1) - dmesg, 부트로더  (0) 2025.04.20
'Linux/Embedded Linux' 카테고리의 다른 글
  • 센서 제어 및 인터페이스 (1) - 라즈베리파이 4 vs 라즈베리파이5
  • 리눅스 시스템 구조와 부트 과정 이해(5) - 디바이스 트리
  • 리눅스 시스템 구조와 부트 과정 이해(3) - 시스템 콜
  • 리눅스 시스템 구조와 부트 과정 이해(2) - 임베디드 리눅스에서의 UART
Dinoj
Dinoj
  • Dinoj
    AlOG
    Dinoj
  • 전체
    오늘
    어제
    • 분류 전체보기 (181)
      • 이론 공부 (63)
        • 기타 학습 (20)
        • UVM (Universal Verification.. (12)
        • AI HARDWARE (12)
        • COMPUTER VISION (18)
        • Python (Pytorch) (1)
      • PROJECTS (29)
        • AI 가속기 (10)
        • 영상 처리 (3)
        • UVM (Universal Verification.. (2)
        • CPU 설계 (5)
        • CMOS VLSI (2)
        • Verilog (2)
        • Firmware (2)
        • C 언어 (2)
        • 기타 프로젝트 (1)
      • Linux (13)
        • Embedded Linux (7)
        • Linux 기초 (6)
      • AMBA BUS (16)
        • AXI BUS (5)
        • APB BUS (2)
        • Vitis (8)
      • AI SOC COURSE (53)
        • 영상 처리 (5)
        • SYSTEM VERILOG (CPU 설계) (20)
        • VERILOG 기초 (5)
        • CMOS VLSI (7)
        • FIRMWARE (9)
        • C PROGRAMMING (1)
        • Python (Keras) (6)
      • 코딩 지식 (5)
        • SYSTEM VERILOG (3)
        • TCL (2)
      • TISTORY (1)
  • 블로그 메뉴

    • 홈
    • 글쓰기
    • 관리
    • Info
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Dinoj
리눅스 시스템 구조와 부트 과정 이해(4) - Bootloader
상단으로

티스토리툴바