Bootloader
: 부팅시 운영체제 사용되기 이전에 동작되는 프로그램으로 Disk 에 저장되어 있는 운영체제
를 실행 시키는 역할
커널이 동작되기 전 준비를 마치고, 커널을 메모리에 적재
후 제어권을 넘기는 프로그램이므로, 메모리 직접 접근
이 가능하다.
부트 스트랩 로더 ” 를 줄여 부트스트랩 or 부트로더 라고 한다. 라즈베리파이는 자체 부트로더 사용 중이다.
리눅스에서는 U-Boot
이라는 부트로더를 사용한다.
Image
: 램에 그대로 올라가면 실행 가능해지도록 만들어진 Binary File
Linux Kernel Image
: 리눅스 소스코드를 빌드 후 , 즉시 램에 올라가면 동작되도록 만들어진 Binary File
리눅스 커널 이미지는 압축
되어 관리된다. 부트로더가 압축을 풀어 메모리에 적재한다
설치 가이드
파일 다운 사이트 : 대표적인 vim 설정 파일
vim 설정 파일 vimrc에 복붙 후 vi를 통해 설치하자!
라즈베리파이에서 사용가능하기 위해서는 snippets 부분을 삭제해주면 에러없이 사용가능하다.
CMOS Chipset
: 메모리 크기, 부팅순서, HW 구성 정보 등과 같은 CMOS Data(설정값)를 저장한다.
BIOS
: 기본적인 I/O 를 위한 Firmware (Basic I/O System), 컴퓨터 부팅
시 바로 BIOS(Firmware) 가 동작을 시작한다. CMOS의 설정값
들을 변경 가능하다
POST
(Power-on Self-Test) : BIOS에서 Power 를 켜자마자 주변장치들을 검사하는 과정으로 Log Message 가 출력된다.
UEFI
(유이파이) : Unified Extensible Firmware Interface로 BIOS 를 대체하는 그래픽 화려한 Firmware이다. 2.2TB 이상 디스크 사용
을 위한 GPT 지원을 한다.
GPT
: GUID 파티션 테이블로 2.2TB 이상 디스크 사용
을 지원한다.
GRUB2
: 리눅스 배포판(우분투)에서 가장 자주 사용하는 GUI 부트로더
U-Boot(Universal Boot Loader)
: ARM(임베디드)에서 리눅스를 쓸 때 가장 자주 사용하는 부트로더로 USB, TCP/IP, Flash 제어 가능하다.
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모드로 진입
help
: 내가 사용가능한 명령어 리스트 출력, Sroll 기능이 작동하지 않아 짤리는 부분은 확인하지 못한다.
set pager=1
을 입력후 help
명령어를 입력해보면 짤리는 부분도 page down
으로 확인가능하다.
sudo vi /etc/default/grub
에서 GRUB_GFXMODE=1024x768로 주석을 풀고 변경해준다.
sudo update-grub
후 sudo reboot
해준다.
cat /boot/grub/grub.cfg
을 통해 파일 열기 가능, ls
명령어도 사용가능
부트로더
이기 때문에, 직접 메모리 접근 가능하다.
쓰기 : write_byte 0x0000 1
읽기 : read_byte 0x0000
=> 0x1
SSH
: 랜카드 없으면 접근 불가능, 부팅 이후에 접근 가능하기 때문에 부트로더 제어 불가능
UART
: 개발하기 불편할 정도로 느림
우선적으로, 라즈베리파이의 Serial Enable로 설정 후 해당 드라이버를 윈도우에 설치해줘야합니다.
전원을 끊고, 라즈베리파이와 : FT232BL
기기와 핀맵을 통해 연결합니다.
5V 연결
GND 연결
RX 는 TX 에 연결하기
TX 는 RX 에 연결하기
그 후, 전원을 가하고, PC와 FT232BL 기기와 연결합니다.
Mobaxterm에서 세션을 생성합니다.
그 후 아이디와 비밀번호는 모두 라즈베리파이 기본 ID : pi, pw : raspberry 로 입력합니다.
U-boot 빌드를 위한 필수 도구 설치
sudo apt install git vim gcc bc bison flex libssl-dev make libc6-dev libncurses5-dev crossbuild-essential-armhf
u-boot 소스코드 다운로드
git clone https://github.com/u-boot/u-boot.git
config 파일 수정
cd u-boot/
후 sudo vi config.mk
파일에 CROSS_COMPILE := arm-linux-gnueabihf-
변수를 추가한다.
.config 파일 생성
sudo make rpi_4_32b_defconfig
를 입력한다.
make menuconfig
로 편리하기 수정할 수 있는 창을 띄울 수 있다.
make로 빌드하기 -> u-boot.bin 파일생성
sudo make -j4
: 라즈베리파이 코어가 4개이므로 j4 사용
복사
sudo cp u-boot.bin /boot
cd /boot
에서 u-boot.bin이 있음을 확인해보자!
/boot 경로 내에 config.txt 수정
sudo vi config.txt
에서 마지막 줄에 kernel=u-boot.bin
를 추가하고 저장!
재부팅후 uart로 키기!
echo
: 입력한 값이 그대로 출력된다.
enter을 계속 입력하면, 최근에 실행한 명령어가 실행된다.
printenv
: 환경변수들을 모두 출력한다. 변수 이름을 출력하려면 ${변수}
입력하면 된다.
botcmd 변수
: 특정 시간까지 입력이 되지 않으면 수행할 명령어들의 모음
ls 장치이름 [device 번호 ]]: 파티션 ] 경로 명령어 : ls mmc 0:1 /
특정 장치의 파일 내용을 볼 수 있다.
mmc 명령어 : Disk 제어 , R/W/Erase 가능
보드에 대한 HW 정보
들을 Linux 커널에 전달하는 방법으로 u-boot
에 의해 메모리에 Load 되어 Linux 커널에 전달되므로 상세 사항을 Linux 커널에 하드코딩할 필요 없다.