부팅 : 전원이 켜진 후 OS가 실행되기 전까지 동작 과정
BIOS (Basic Input Output System) : 메인보드 ROM에 포함된 펌웨어로서, CMOS에 저장된 설정을 읽어서 하드웨어를 초기화하고, 운영체제를 메모리에 로드.
부트로더: OS를 읽어서 주기억장치에 저장하여 사용자가 컴퓨터를 사용할수 있게 하는 프로그램으로서, 컴퓨터가 텨지면 제일 먼저 실행되는 프로그램으로서 하드디스크의 MBR에 저장. 즉, 임베디드 리눅스가 부팅되기 전 까지의 과정을 수행하는 부팅 프로그램.
MBR (Master boot Record) : 하드디스크의 첫번째 섹터(섹터0)인 512byte 시동 섹터이며, 컴퓨터가 부팅될때 하드디스크에서 첫번째로 읽히는 영역
임베디드시스템은 하드디스크 대신 플래시 메모리 또는 SD카드 등으로 부트로더를 저장하여, 전원이 켜지면 부팅되도록 함
플래시 메모리(Fash Memory) : USB메모리, SD카드,Micro SD카드, SSD 등이 있음. 충격과 환경이 강함.
커널 (Kernel): 부팅이 시작되면 시스템이 초기화되면서, 커널이 주메모리(DRAM)에 저장되어, 시스템이 종료될때까지 메모리에 상주. 시스템의 장치들(CPU,메모리,I/O,디스크,디스플레이 등)을 관리하고 제어하는 소프트웨어.
임베디드 부트로더 : 임베디드는 PC와 달리 CMOS를 이용할수 없는 사용 환경이므로 부트로더가 사용됨.
부트로더 위치 : 일반적으로 시스템 메모리의 물리 주소 0번지에서 시작
부트로더 기능 : StartUp, 모니터링 모드, OS 부팅. Clock 메모리 시리얼포트 네트워크 초기화 및 커널과 Root File System을 메모리에 저장하여 리눅스를 실행 시킴
부트로더 종류 : 시스템구조마다 다르고, 운영체제 마다 다르며, 다양함. 오픈 소스 부트로더 사용 추천함. X86 리눅스 계열의 부트로더는 LILO(Linux Loader), GRUB(Grand Unified Boot loader)를 주로 사용되며, 최근에는 대부분 GLUB를 기본으로 사용함.임베디드 리눅스에서는 ARM 계열의 BLOB와 ARMBOOT, MPC계열의 PPCBOOT가 있음.
U-BOOT(Universal Bootloader) : ARMBOOT와 PPCBOOT를 기반으로 개발, PowerPC ARM MIPS X86 등 대부분의 프로세서를 지원하고 임베디드를 위해 제작된 부트로더. Open Source. 환경 설정이 쉽고 심플한 코드로 구성되어 많은 임베디드 개발자들이 사용함.
U-BOOT 특징 : Linux와 호환이 잘되고, 새로운 명령어 추가 및 Configuration에 기능 추가 가능함.
ftp://ftp.denx.de/pub/u-boot
부트로더 동작 순서:
1) start.s : 어셈블리어로 작성되며 main() 시작전에 실행되어, gpio 설정, 클록 설정 및 시작, SRAM DRAM설정, 부팅 부분을 RAM에 복사, 스택 포인터 설정 등을 실행함
2) main() : main.c, UART 타이머 이더넷 등을 초기화, 부팅모드 자동 수동 선택 모드
3) 자동부팅모드 선택 실행경우
4) autoboot_mode() : 부팅모드 자동 선택시 실행
5) 커널부팅
3) 수동부팅모드 선택 실행경우
4) command_mode()
5) get_command()
6) 프롬프트에서 명령어 실행
7) boot()
8) 커널부팅
부트로더 동작 세부 설명:
1) MPU 내부 ROM code (BL0) : Clock Stack Heap 같은 MPU 설정 초기화. OS저장장치에서 내부 SRAM(DRAM보다 빠름)에 first boot loader(BL1) image를 load. 시스템 (타켓 보드)를 초기화하는 내용은 포함되어있지 않음. DIP 스위치를 이용하여 OS저장장치(eMMC, SD메모리카드 등)를 선택하도록 하기도 함.
2) Firt Boot loader(BL1) : MPU 외부 메모리에 저장되어있음. 타켓 보드를 초기화함. BL2를 실행하기 위한 선행작업을 진행. OS저장장치(SD카드 등)에 있는 Second boot loader(BL2)를 내부 SRAM에 load. BL2에는 부트로더 전체 바이너리(u-boot.bin)가 포함되어있음.
3) Secodn boot loader(BL2) : 내부 SRAM에 저장된 BL2를 읽어서 U-BOOT를 실행. System Clock, UART, DRAM controller를 초기화 하고, OS image를 부팅장치로부터 DRAM으로 load.
4) 부팅이 완료되면, BL2는 OS로 jump 전환됨. 부트로더에서 사용자 입력이 없으면, 마지막 단계로 커널 이미지를 DRAM으로 load한 후 커널 실행
틀리거나 명확하지 않은 부분은, 댓글로 알려주세요~
초보자가 알면 좋은 임베디드 리눅스 시스템 개발과정 조금 (0) | 2021.08.03 |
---|---|
라즈베리파이3에 우분투 설치 (1) | 2021.08.02 |
리눅스 gcc 컴파일 링커 make Makefile (0) | 2021.08.01 |
리눅스 Vim 모드 코딩 (0) | 2021.07.31 |
리눅스에서 소스 컴파일 과 프로그램 설치 (0) | 2021.07.31 |
댓글 영역