본문 바로가기
개발Study/Linux

uImage와 zImage

by happy90 2017. 5. 3.
SMALL

uImage와 zImage


둘 다 압축된커널 이미지이며, 차이점이 있다.


zImage : 커널 바이너리. 보통 make 명령어로 커널을 빌드하면 얘가 나온다. 

부팅할때 zImage를 사용하면 boot option으로 메모리의 어느 번지에 올라가야 하는지 지정해주어야 한다.

bootloader에서는 자기자신이 끝나고 해당 번지로 점프하고, 해당 번지의 zImage가 압축을 풀며 커널이 부팅되는 것이다.




uImage : zImage에 다른 가공을 한 바이너리이다. u-boot source에 있는 mkimage라는 툴을 이용하여 u-boot용 커널이미지를 생성한 것이다.

생성 명령어

./mkimage -A arm -O linux -T kernel -C none -a 0x3008000 -e 0x0008000 -n "linux-2.6.35" -d arch/arm/boot/zImage arch/arm/boot/uImage 

얘는 zImage앞에 64byte의 헤더가 붙어서, 커널이 몇번지에 올라가야하는지, 커널이 무슨 종류인지, 등의 정보를 싣게 된다.

(target architecture, operating system, image type, compression method, entry points, time stamp, CRC32 checksums 등)

zImage와 달리 bootloader에서 uImage를 실행시키면 uImage가 알아서 자기위치에 압출풀고 실행된다는 것이다.


uImage를 사용하는 경우는 u-boot에서 kernel단으로 이런저런 정보를 줄 수 있다.

간단하게 드라이버에 관한 설정 정보같은것들도 있다.

드라이버에서는 u-boot의 kernel parameter를 읽어다가 셋팅하는 구조를 구현해놓고, u-boot에서 parameter 값이 설정이 되어있으면 갖다 쓸 수 있는 것이다.

대표적인 예는 콘솔 UART이다. 임베디드리눅스는 꼭! debug console이 있어야 하고, bootloader부터 kernel message까지 볼 수 있어야하기 때문에 필수로 지정된다.

또 예를 들면 LCD 드라이버. LCD가 어떤 종류이고 해상도는 어떻고 등등의 정보를 u-boot parameter로 설정할 수 있다.

이렇게 하면 LCD를 여러 종류 포팅한 경우에 유용하다. 부팅할 때 LCD를 선택하는 역할이 된다.

더 좋은 예로 mac address 설정같은 부분이 있을 수 있다.

mac address는 NIC고유의 값을 가져야 하므로 제품 생산과정에서 bootcmd를 통해 한번 설정해 놓으면 드라이버나 어플리케이션 레벨에서 별도로 설정해주지 않아도 되니까.

이런 식으로 편리하게 응용하면 좋다.

요즘 커널은 dtb가 있으니까, dtb에서 설정하고 대신에 boot parameter에 어떤 dtb를 사용할지 입력하게 된다.

보통 u-boot에서 command모드로 들어가면 아래와 같은 방법으로 parameter 값을 확인하고 변경할 수 있다.



참조

http://forum.falinux.com/zbxe/index.php?document_srl=564748&mid=lecture_tip


LIST

'개발Study > Linux' 카테고리의 다른 글

openssl / openssh build  (0) 2021.12.13
filesystem size 변경  (0) 2021.11.10
Linux kernel panic debugging  (0) 2017.02.24

댓글