이번에는 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 |