본문 바로가기

ARM아키텍쳐

[ARM] Bootloader + Kernel + RFS

이번에는 Bootloader와 Kernel 뿐 아니라 루트 파일 시스템과 함께 부팅을 진행할 것이다.

 

$ wget http://busybox.net/downloads/busybox-1.21.1.tar.bz2
$ tar -xvf busybox-1.21.1.tar.bz2

 

루트파일 시스템을 부팅하기 위해선 busybox를 다운받아야한다.

 

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig

 

다음 명령어로 빌드를 진행하면 아래와 같은 menuconfig 창이 뜨는데 busybox setting --> Build Options --> static binary 박스를 [*] 체크 해야한다.

$ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- install

그리고 최종 빌드를 진행한다.

 

$ cd _install/
$ find . | cpio -H newc -o | gzip > rootfs.img.gz

 

최종 빌드를 진행한 후 위와 같은 명령어로 rootfs.img.gz 루트파일 시스템을 생성한다.

 

해당 루트파일 시스템으로 테스트용으로 zImage와 결합하여 부팅을 진행해보자

그 전에 생성했던 zImage 파일을 busybox/_install 경로에 복사하여준다.

 

 

$ qemu-system-arm -M versatilepb -m 128M -kernel ./zImage -initrd ./rootfs.img.gz -append "root=/dev/ram rdinit=/bin/sh console=ttyAMA0,115200" -nographic

 

그 이후 다음 명령어로 Kernel과 루트 파일 시스템만 부팅해본다.

마지막에 루트파일 시스템이 나오는것을 볼 수 있다.

 

이제 최종적으로 bootloader까지 포함하여 부팅을 진행해보자.

먼저 u-boot/config/versatile.h에서 rdinit=/bin/sh를 추가하고

다음 줄에 CONFIG__BOOTCOMMAND로 "bootm 0x210000 0x510000"을 추가한다.

해당 라인은 kernel이 있는 0x210000 주소를 자동 부팅하고 그 후 0x510000 주소를 참조하여 자동 부팅하라는 의미이다.

0x510000 주소가 루트 파일 시스템이 존재하는 주소임을 알 수 있다.
해당 라인을 u-boot에서 추가한 후에

 

make all ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

다음 명령어로 u-boot를 다시 빌드해준다.

 

$ dd if=/dev/zero of=flash.bin bs=1 count=7M
$ dd if=u-boot.bin of=flash.bin conv=notrunc bs=1  # uboot.bin
$ mkimage -A arm -C none -O linux -T kernel -d [zImage 경로] -a 0x00010000 -e 0x00010000 zImage.uimg 
$ dd if= zImage.uimg of=flash.bin conv=notrunc bs=1 seek=2M # uimage(kernel)
$ mkimage -A arm -C none -O linux -T ramdisk -d rootfs.img.gz -a 0x00800000 -e 0x00800000 rootfs.uimg 
$ dd if= rootfs.uimg of=flash.bin conv=notrunc bs=1 seek=5M

 

그리고 다음 명령어로 flash.bin의 0x500000 offset에 rootfs.uimg를 추가하여 루트파일 시스템을 생성해준다.

 

qemu-system-arm -M versatilepb -m 128M -kernel flash.bin -nographic

 

마지막으로 다음 명령어로 flash.bin을 qemu로 돌리면

 

bootloader + kernel + RFS가 한번에 돌아가는것을 볼 수 있다.

 

 

--------------------bootloader 메시지---------------------

:autoboot가 뜨는것을 볼 수 있다.(CONFIG_BOOTCOMMAND로 인한 자동 부팅)

 

--------------------Kernel 부팅 메시지---------------------

 

--------------------RFS 부팅 메시지---------------------

 

커널 부팅이 완료되면 엔터를 눌러 RFS이 어떻게 구성되어 있는지 확인할 수 있고 ls와 같은 명령어로 확인 가능하다.

 

이렇게 bootloader 및 kernel과 RFS를 직접 부팅해보는 과정을 거쳤으니

다음번엔 iptime 공유기의 펌웨어를 다운받아 직접 bootloader와 Kernel 그리고 RFS를 분해하여 따로따로 부팅해보는 과정을 진행해 볼 것이다.

'ARM아키텍쳐' 카테고리의 다른 글

[ARM] iptime 펌웨어 분석  (1) 2023.01.25
[ARM] Bootloader + Kerenl 부팅  (0) 2023.01.24
[ARM] Kernel 설치  (0) 2023.01.24
[ARM] Boot Loader 설치  (0) 2023.01.11
[ARM] Cross-Compiler 설치  (0) 2023.01.11