고급 개발자로 가는 길

OS/Linux

uboot 모드 작업하기

다크엔지니어 2020. 5. 9. 15:49
반응형

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