반응형

📌 ROM 코드

 

 

🧱 ROM 코드란?

  • 전원이 켜지거나 리셋된 직후 실행되는 SoC 내장 코드
  • 칩 제조 시 내장됨수정 불가 / 오픈소스 대체 불가
  • 외부 메모리 사용 전 실행되어야 하므로 온칩 SRAM만 사용
  • DRAM 컨트롤러 초기화 코드 없음 (디바이스마다 다르기 때문)

💾 SRAM 크기

  • SoC마다 다름 (보통 4KB ~ 수백 KB 수준)

📥 ROM 코드의 역할

  • 다양한 저장 장치에서 작은 코드 조각을 SRAM으로 로드
  • 예시
    • NAND Flash 앞쪽 페이지
    • SPI Flash
    • MMC/eMMC/SD 카드 첫 섹터 또는 MLO 파일
  • 로드 실패 시
    • 이더넷, USB, UART로 바이트 스트림 수신 시도 (UART는 주로 생산 과정에서 플래시에 코드 쓰기 위해 사용)

🔁 SPL (Secondary Program Loader)

  • SRAM 공간이 작아 U-Boot 같은 전체 부트로더를 못 넣는 경우 사용
  • SPL이 중간 단계 부트로더 역할 수행

🔚 종료 시점

  • SPL이 SRAM에 로드됨
  • ROM 코드는 SPL의 시작 지점으로 점프

 


SPL (Secondary Program Loader)

🔧 SPL의 역할

  • DRAM에 TPL(Tertiary Program Loader)을 로드하기 위한 준비 단계
  • 메모리 컨트롤러 및 필수 하드웨어 설정
  • 온칩 SRAM 내에서 실행되며, 용량 제한 있음

📥 코드 로드 기능

  • ROM 코드와 유사하게 저장장치에서 코드 읽기 가능
    • 플래시의 프리셋 오프셋에서 로드
    • 파일 시스템 드라이버가 내장되어 있다면 u-boot.img 같은 파일 이름 기준 로딩도 가능

👤 사용자 인터페이스

  • 보통 사용자 입력은 불가능
  • 하지만 콘솔에 버전 정보, 진행 상황 출력 가능

💾 오픈소스 vs 바이너리

  • TI의 x-loader, Atmel의 AT91Bootstrap 등은 오픈소스 SPL
  • 제조사 제공 바이너리 블롭 형태의 SPL도 흔함

🧠 종료 시점

  • TPL이 DRAM에 로드됨
  • SPL이 해당 위치로 점프하여 TPL 실행

📊 부트 순서 다이어그램

 


TPL (Tertiary Program Loader)

🚀 TPL이란?

  • 이제 전체 기능의 부트로더(U-Boot 등) 실행됨
  • DRAM에서 실행되며, 부트 로딩의 최종 단계
  • 사용자 인터페이스, 명령어 기능, 자동 부트 등 포함

🛠 주요 기능

  • 커널 및 부트 이미지 로드 / 업데이트
  • 커널 자동 부팅 기능 포함 가능
  • FDT (Device Tree) 및 initramfs를 커널 이미지에 추가 가능 → 모든 구성 요소를 DRAM에 적재 가능

👤 사용자 인터페이스

  • 커맨드라인 UI 제공
  • 플래시에 이미지 저장하거나, 커널 수동/자동 부팅 가능

🧠 종료 시점

  • 커널 이미지가 DRAM에 완전히 적재됨
  • TPL이 커널로 제어를 넘김
  • 커널 실행 이후, TPL 및 이전 부트로더는 메모리에서 사라짐

📊 부트 순서 다이어그램

반응형
반응형

🧠 부트로더의 두 가지 주요 역할

  1. 시스템 초기화
    • 최소한의 시스템만 초기화 (DRAM, 인터페이스 등 아직 미설정)
  2. 커널 로드
    • 커널을 메모리에 로드하고 실행 환경 구성

⚙️ 부트 순서 요약

  1. 전원 ON 또는 리셋 시점
    • 시스템은 매우 제한된 상태
    • 동작 가능한 자원: CPU 코어, 온칩 메모리, 부트 ROM
  2. 초기 부트 코드 실행
    • DRAM 컨트롤러 설정
    • 메모리 접근 가능하게 됨
    • 부트로더 코드를 DRAM으로 복사
  3. 커널 로드 및 실행 준비
    • 커널을 플래시에서 DRAM으로 복사
    • 하드웨어 설정 정보와 커널 커맨드 라인을 커널에 전달
    • 제어를 커널로 넘김 → 부트로더는 더 이상 필요 없음

🧱 예전의 단순한 부트 구조 (NOR Flash 사용 시)

 

🔹 특징

  • 부트로더를 리셋 벡터(0xFFFFFFFC) 위치에 배치
  • NOR Flash는 직접 주소 매핑 가능 → 실행 간편
  • 초기 점프 명령어로 부트로더 코드 실행 시작

🔸 동작 흐름

  1. NOR Flash에서 부트로더 실행
  2. DRAM 초기화 후, 부트로더를 DRAM으로 복사
  3. 커널을 플래시에서 DRAM으로 복사
  4. 커널 실행

🌀 복잡한 현대 부트 시퀀스

  • NOR Flash가 아닌 다른 저장장치 사용 시 (e.g. NAND, eMMC 등)
  • 부트 과정이 멀티 스테이지로 복잡해짐
  • SoC에 따라 부트 절차가 매우 다름
  • 일반적으로:
    1. 부트 ROM → 1단계 부트로더
    2. 1단계 → 2단계 부트로더
    3. 2단계 → 커널 로딩

 

반응형
반응형

임베디드 리눅스 프로그래밍 완전정복

 

 

툴체인

  • 소스 코드를 타깃 장치에서 실행할 수 있는 실행 파일
  • 컴파일러, 링커, 런타임 라이브러리를 포함하는 컴파일 도구들의 집합
  • 리눅스 시스템의 나머지 세 가지 요소 (부트로더, 커널, 루트파일시스템)를 빌드하기 위해 툴체인이 필요
  • 리눅스용 툴체인은 대부분 GNU 프로젝트에서 만들어진 요소에 기반을 두고 있다.

GNU 툴체인 세 가지 주요 요소

  • Binutils: 어셈블리와 링커를 포함하는 바이너리 유틸리티의 집합
  • GCC: C와 여러 언어를 위한 컴파일러, 공통 백엔드를 사용해 어셈블리 코드를 만들고, GNU 어셈블러로 넘긴다.
  • C 라이브러리: POSIX 규격에 기반을 둔 표준 API

종류

 

CPU 아키텍처

  • CPU 종류: ARM, MIPS, x86_64 등
  • Big endian / Little endian: 두 가지 모드로 동작 할 수 있는 CPU가 있지만, 기계어 코드가 다르다.
  • ABI ( Application Binary Interface): 함수 호출간에 인자를 넘기는 호출 규칙

 

Ubuntu 20.04 LTS 에 설치하는 명령어

$ sudo apt-get install autoconf automake bison bzip2 cmake \ 
flex g++ gawk gcc gettext git gperf help2man libncurses5-dev libstdc++6 libtool \ 
libtool-bin make
patch python3-dev rsync texinfo unzip wget xz-utils

 

권장 설치 명령어 예시

$sudo apt-get update
$sudo add-apt-repository universe
$sudo apt-get install autoconf automake bison bzip2 cmake \
$flex g++ gawk gcc gettext git gperf help2man libncurses5-dev \
$libstdc++6 libtool make patch python3-dev rsync texinfo unzip wget xz-utils

 

반응형

+ Recent posts