uboot 에 대해 정리를 해볼까 한다.
uboot 다 알겠지만 bootloader 이다.
bootloader 는 bl0 bl1 bl2 로 나누어지며,
bl0 은 internal ram 에서 boot type? 을 찾고
bl1 은 MLO 라는 이미지 파일로 bl2 를 실행해주는 역할을 한다. 4KB ~ 16KB 정도의 크기를 가지고 있다.
bl2 는 U-boot.img 로 실제 우리가 흔히 알고있는 uboot 이다.
자 그럼 uboot Image 에 대해 더 들어가보자. uboot Image를 uart mode 를 통해 푸싱하고 uboot 모드로 들어가본다.
uboot 모드에서는 ram 과 rom 에 write erase read 를 할 수 있다. 중요한 의미이다. uboot 는 rom 의 첫번째 블럭에 존재한다.
아래는 uboot 모드에서 사용하는 명령어다.
명령어 |
설명 |
bdinfo |
board에 대한 정보를 화면에 출력 한다. |
coninfo |
console에 대한 device 정보를 화면에 출력 한다. |
flinfo |
Flash Memory에 대한 정보를 화면에 출력 한다. |
iminfo |
Image Header 정보를 화면에 출력 한다. |
base |
memory의 base address를 설정 하거나 화면에 출력 한다. |
crc32 |
crc32를 계산 하거나 계산한 결과를 특정 메모리에 저장 한다. |
cmp |
memory의 내용을 비교 한다. (byte, word, long word) |
cp |
memory의 내용을 복사 한다. (byte, word, long word) |
md |
memory의 내용을 화면에 출력 한다. (byte, word, long word) |
mm |
memory의 내용을 변경 한다. (byte, word, long word) |
mtest |
RAM read/write 테스트를 실행 한다. |
mw |
memory의 내용을 특정 값으로 채워 넣는다. (byte, word, long word) |
nm |
memory의 동일한 번지에 값만 바꿔서 넣는다. (byte, word, long word) |
loop |
memory의 특정 영역을 반복하여 실행 한다. 무한 loop 이기 때문에 실행 후 reset을 하여야 loop가 종료 된다. (byte, word, long word) |
erase |
flash의 내용을 지운다. 영역은 주소, 길이, sector, bank, flash 전체 등으로 줄 수 있다. |
protect |
flash의 write protect를 enable/disable 할 수 있다. 이것 역시 영역을 주소, 길이, sector, bank, flash 전체 등으로 줄 수 있다. |
mtdpart |
MTD partition table을 보거나 수정 하기 위해 사용 한다. |
source |
특정 주소에 있는 script를 실행 한다. |
bootm |
특정 memory의 주소에 있는 image로 부팅을 한다. image, ramdisk, kernel을 설정을 위한 sub command들이 있음. |
go |
특정 memory의 주소에 있는 application을 실행 한다. |
bootp |
BOOTP/TFTP를 사용하여 Boot Image를 특정 메모리 주소에 다운로드 한다. |
dhcp |
DHCP/TFTP를 사용하여 Boot Image를 특정 메모리 주소에 다운로드 한다. |
loadb |
serial line(kermit mode)로 binary file을 특정 주소에 로드 한다. |
loads |
serial line을 사용하여 S-Record file을 특정 수조에 로드 한다. |
rarp |
RARP/TFTP를 사용하여 Boot Image를 특정 메모리 주소에 다운로드 한다. |
tftpboot |
TFTP를 사용하여 Boot Image를 특정 메모리 주소에 다운로드 한다. |
printenv |
환경변수를 화면에 출력 한다. |
setenv |
환경변수 설정 |
saveenv |
환경변수를 flash에 저장한다. |
run |
환경변수의 값의 내용을 실행한다. |
boot |
bootcmd의 값을 사용하여 시스템 부팅을 시작한다. (run bootcmd) |
U-Boot 환경 변수
변수명 |
내용 |
autoload |
변수 값이 "no"나 "n"으로 설정 되어 있다면 rarp, bootp, dhcp 명령은 BOOTP/DHCP 서버로 부터 검색된 서버 정보를 통해 다운로드 한다. 그렇지 않은 경우 TFTP를 사용 하여 다운로드 한다. |
autostart |
rarp, bootp, dhcp, tftp, disk, doob를 통해 로드된 boot 이미지를 자동으로 시작 한다. |
baudrate |
console의 10진수 baudrate |
bootargs |
부팅시 커널에 전달할 인수. |
bootcmd |
자동으로 부팅할 때 사용할 command 정의 |
bootdelay |
부팅 인터럽트 대기 시간 (초) |
bootfile |
tftp를 통해 로드될 기본 이미지 이름 |
cpuclk |
cpu clock 변경 ARM에서는 사용 불가 |
ethaddr |
ethernet 주소 |
eth1addr |
second interface의 ethernet 주소 |
initrd_high |
ramdisk 위치를 지정하기 위해 사용 |
ipaddr |
board ip 주소 |
loadaddr |
tftp 명령어로 boot image가 로드될 주소 |
pram |
??? 특정 영역의 메모리를 다른 용도로 사용하기 위해 사용 |
serverip |
tftp 서버 주소 |
serial# |
장비 s/n |
silent |
console out을 막기 위해 사용 |
verify |
check sum 실행 여부 설정, 사용하지 않으려면 "no"혹은 "n" 사용 |
dnsip |
dns server ip |
gatewayip |
gateway ip |
hostname |
host name |
rootpath |
NFS Server에서 root file system의 경로 |
filesize |
마지막에 bootp, dhcp, tftp 명령어로 다운로드한 이미지 파일의 크기 |
명령어들을 보면 알겠지만 ram 에 기본적으로 접근이 가능하고 ram 을 통해서 rom 에 쓸수있다.
즉 이말은 초기에 rom 을 작업할때 uboot 모드에서도 작업이 가능하다는 말이된다.
예를들어
> mw.b 82000000 FF 20000
> load.i 82000000
transfer -> kermit -> read 를 통해 올리고자 하는 이미지를 받는다. 그러면 ram 82000000 에 올라간다.
> nand erase 20000 40000
> nand write 82000000 20000 40000
등의 작업으로 ram 에 이미지를 올리고 rom 으로 옮기는 작업이 가능하다. ㅎㅎ
이외에도 환경변수가 존재하는데
pri printenv 라는 명령어로 확인이 가능하다.
그러기 위해서는 setting 을 해주어야 하는데 그게 바로 setenv, saveenv 등의 과정이 존재한다.
env 에는 보통 target 보드에 tftp 하기위한 serverip addrip gateway netmask rootpath 등을 설정해주며
pri 를 통해 그 정보를 출력한다. 그외에도 flinfo, coninfo, 등이 있으며
memory 관련해서도 mw, mm, nm, md, mtest 등이 존재한다.
실제 원시 flash memory 가 존재하는 보드에서 이러한 작업들을 하게 된다.
순서를 간략하게 말하자면 uboot Image 를 x ymodem 을 통해 올려서 uboot 모드에 진입하는데 위의 작업을 통해 tftp 로 zImage 를 fusing한다.
그 다음 kernel 이 올라간 후 로그인 접속을 하여 rootfs 을 올리게 되는데 그 방법으로 ubifs 을 통해 이루어 진다.
ubifs 을 통해 flash memory 에 접근이 가능한데 zImage 의 kernel 안에서 ubifs 을 통해 flash memory에 mount 하여 rootfs 을 올려 작업이 이루어진다.
ubifs 관련해서 글을 올린적이 있는데 궁금하다면 거기를 참고하자.
'OS > Linux' 카테고리의 다른 글
rsync 암호 서버 동기화 (0) | 2020.11.18 |
---|---|
커널을 분석해보자 (0) | 2020.05.19 |
shell script (0) | 2020.05.08 |
UBI 혼자 끄적 (1) | 2020.04.29 |
임베디드 리눅스의 구조 (0) | 2020.04.25 |