[커널] 부트로더

정재훈·2022년 5월 12일
0

Kernel

목록 보기
8/8

Bootloader

Bootloader 란

Bootloader: 부팅시 운영체제 사용되기 이전에 동작되는 프로그램으로 Disk 에 저장되어 있는 운영체제를 실행 시키는 역할
커널이 동작되기 전 준비를 마치고, 커널을 메모리에 적재 후 제어권을 넘기는 프로그램이므로, 메모리 직접 접근이 가능하다.
부트 스트랩 로더 ” 를 줄여 부트스트랩 or 부트로더 라고 한다. 라즈베리파이는 자체 부트로더 사용 중이다.

리눅스에서는 U-Boot이라는 부트로더를 사용한다.

수행 기능

  1. 다중 OS 부팅 기능
  2. 장치 제어 및 테스트 기능

Kernel Image

Image : 램에 그대로 올라가면 실행 가능해지도록 만들어진 Binary File
Linux Kernel Image : 리눅스 소스코드를 빌드 후 , 즉시 램에 올라가면 동작되도록 만들어진 Binary File

리눅스 커널 이미지는 압축되어 관리된다. 부트로더가 압축을 풀어 메모리에 적재한다

커널 이미지 종류

  1. zImage : gzip 으로 압축된 Kernel Image
  2. bzImage : 빅 zImage, 파일 크기(약 1MB 이상)가 큰 Kernel Image 를 뜻함

Vim-bootstrap

설치 가이드
파일 다운 사이트 : 대표적인 vim 설정 파일
vim 설정 파일 vimrc에 복붙 후 vi를 통해 설치하자!

라즈베리파이에서 사용가능하기 위해서는 snippets 부분을 삭제해주면 에러없이 사용가능하다.

CMOS(하드웨어)

CMOS Chipset : 메모리 크기, 부팅순서, HW 구성 정보 등과 같은 CMOS Data(설정값)를 저장한다.

BIOS(프로그램)

BIOS : 기본적인 I/O 를 위한 Firmware (Basic I/O System), 컴퓨터 부팅시 바로 BIOS(Firmware) 가 동작을 시작한다. CMOS의 설정값들을 변경 가능하다

POST

POST(Power-on Self-Test) : BIOS에서 Power 를 켜자마자 주변장치들을 검사하는 과정으로 Log Message 가 출력된다.

UEFI

UEFI(유이파이) : Unified Extensible Firmware Interface로 BIOS 를 대체하는 그래픽 화려한 Firmware이다. 2.2TB 이상 디스크 사용을 위한 GPT 지원을 한다.

GPT : GUID 파티션 테이블로 2.2TB 이상 디스크 사용을 지원한다.

GRUB2

GRUB2 : 리눅스 배포판(우분투)에서 가장 자주 사용하는 GUI 부트로더

U-BOOT

U-Boot(Universal Boot Loader) : ARM(임베디드)에서 리눅스를 쓸 때 가장 자주 사용하는 부트로더로 USB, TCP/IP, Flash 제어 가능하다.

임베디드 부팅 순서

  • 0, 1 단계 : 칩셋 사 제공, 제어권을 넘긴다.
  • 2 단계 : Bootloader (u-boot) : 메모리 직접 접근하여 장치 테스트 가능, 리눅스 커널을 적재하여 리눅스 부팅
  • Linux Kernel 실행

GRUB 다루기

cd /etc/default에서 grub을 sudo vi로 열고 내용 살짝 바꾸기
style = menu를 변경하여 메뉴창을 띄우고, 10초동안 키 입력 없을 시 넘어가는 설정

sudo update-grub을 통해 수정 사항 저장시키면 /boot/grup 경로에 grup.cfg라는 환경설정 파일이 생성된다.

추가 명령어

sudo reboot를 통해 GRUB을 실행시킬 수 있다. GRUB이 실행된 후 입력을 가하면 다음 스텝으로 넘어가지 않고 고정된다.
e : grub.cnf 내용 확인
c : command모드로 진입

Command 모드

help : 내가 사용가능한 명령어 리스트 출력, Sroll 기능이 작동하지 않아 짤리는 부분은 확인하지 못한다.
set pager=1을 입력후 help명령어를 입력해보면 짤리는 부분도 page down으로 확인가능하다.

해상도 변경하기

sudo vi /etc/default/grub에서 GRUB_GFXMODE=1024x768로 주석을 풀고 변경해준다.
sudo update-grubsudo reboot해준다.

파일 시스템 탐색

cat /boot/grub/grub.cfg을 통해 파일 열기 가능, ls 명령어도 사용가능

직접 메모리에 접근

부트로더이기 때문에, 직접 메모리 접근 가능하다.
쓰기 : write_byte 0x0000 1
읽기 : read_byte 0x0000 => 0x1

SSH(무선) vs UART(serial,유선)

SSH : 랜카드 없으면 접근 불가능, 부팅 이후에 접근 가능하기 때문에 부트로더 제어 불가능
UART : 개발하기 불편할 정도로 느림

U-Boot 실습

우선적으로, 라즈베리파이의 Serial Enable로 설정 후 해당 드라이버를 윈도우에 설치해줘야합니다.
전원을 끊고, 라즈베리파이와 : FT232BL 기기와 핀맵을 통해 연결합니다.
5V 연결
GND 연결
RX 는 TX 에 연결하기
TX 는 RX 에 연결하기

그 후, 전원을 가하고, PC와 FT232BL 기기와 연결합니다.

Mobaxterm에서 세션을 생성합니다.

그 후 아이디와 비밀번호는 모두 라즈베리파이 기본 ID : pi, pw : raspberry 로 입력합니다.

설치

  1. U-boot 빌드를 위한 필수 도구 설치
    sudo apt install git vim gcc bc bison flex libssl-dev make libc6-dev libncurses5-dev crossbuild-essential-armhf

  2. u-boot 소스코드 다운로드
    git clone https://github.com/u-boot/u-boot.git

  3. config 파일 수정
    cd u-boot/sudo vi config.mk파일에 CROSS_COMPILE := arm-linux-gnueabihf- 변수를 추가한다.

  4. .config 파일 생성
    sudo make rpi_4_32b_defconfig를 입력한다.

make menuconfig로 편리하기 수정할 수 있는 창을 띄울 수 있다.

  1. make로 빌드하기 -> u-boot.bin 파일생성
    sudo make -j4 : 라즈베리파이 코어가 4개이므로 j4 사용

  2. 복사
    sudo cp u-boot.bin /boot

cd /boot에서 u-boot.bin이 있음을 확인해보자!

  1. /boot 경로 내에 config.txt 수정
    sudo vi config.txt에서 마지막 줄에 kernel=u-boot.bin를 추가하고 저장!

  2. 재부팅후 uart로 키기!

U-Boot Command

  1. echo : 입력한 값이 그대로 출력된다.
    enter을 계속 입력하면, 최근에 실행한 명령어가 실행된다.

  2. printenv : 환경변수들을 모두 출력한다. 변수 이름을 출력하려면 ${변수} 입력하면 된다.

    botcmd 변수 : 특정 시간까지 입력이 되지 않으면 수행할 명령어들의 모음

  3. ls 장치이름 [device 번호 ]]: 파티션 ] 경로 명령어 : ls mmc 0:1 / 특정 장치의 파일 내용을 볼 수 있다.

  4. mmc 명령어 : Disk 제어 , R/W/Erase 가능

  • md 메모리 출력
  • nm : 메모리 수정

dtb

보드에 대한 HW 정보들을 Linux 커널에 전달하는 방법으로 u-boot에 의해 메모리에 Load 되어 Linux 커널에 전달되므로 상세 사항을 Linux 커널에 하드코딩할 필요 없다.

profile
여러 방향으로 접근하는 개발자

0개의 댓글