Qemu仿真----(4)在ARM64上运行系统
平台:ubuntu 22.04
对象:qemu仿真ARM64.
文件:linux-5.10.7、busybox-1.33.1
1.安装依赖
$ sudo apt install build-essential bc flex bison gawk texinfo file tree curl wget unzip libncurses-dev libssl-dev git ssh libc6-dev $ sudo apt install gcc-aarch64-linux-gnu $ sudo apt install qemu-system-aarch64
2.下载资源
kernel:
[https://kernel.org/]
busybox:
[https://busybox.net/downloads/]
3.编译内核
$ tar -xvf linux-5.10.7.tar.xz $ cd linux-5.10.7/ $ make defconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- $ make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
4.制作根文件系统
4.1 创建rootfs文件夹
$ mkdir rootfs
4.2 解压busybox
$ tar -xvf busybox-1.33.1.tar.bz2 $ cd busybox-1.33.1/
4.3 配置config
$ make defconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- $ make menuconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
做如下修改:
// 勾选编译静态库 Settings ---> [*] Build static binary (no shared libs)
4.4 编译
$ make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- $ make install ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
4.5 创建根文件系统
$ cp -rf busybox-1.33.1/_install/* ./rootfs $ cd ./rootfs/ $ mkdir lib proc tmp dev home etc sys opt mnt $ mkdir -p etc/init.d
4.6 安装modules
[非必要时,建议跳过此步,因为文件量很大,此步骤影响驱动相关内容]。
$ cd linux-5.10.7/ $ make ARCH=arm64 modules_install INSTALL_MOD_PATH=../rootfs
4.7 添加rcS
$ cd rootfs/etc/init.d $ touch rcS $ chmod a+x rcS $ vim rcS
添加如下内容:
echo "---------------------------" echo "--------hello world--------" echo "---------------------------"
4.8 复制动态库
前面步骤有安装gcc-10-aarch64-linux-gnu,我们把它的库复制到根文件系统。
$ sudo cp -rf /usr/aarch64-linux-gnu/lib/* ./rootfs/lib/
4.9 创建设备节点
$ cd rootfs/dev/ $ sudo mknod -m 664 tty1 c 4 1 $ sudo mknod -m 664 tty2 c 4 2 $ sudo mknod -m 664 tty3 c 4 3 $ sudo mknod -m 664 tty4 c 4 4 $ sudo mknod -m 664 console c 5 1 $ sudo mknod -m 664 null c 1 3
4.10 打包文件系统
# count值根据实际rootfs大小定,如果没有执行4.6步骤,128应该够用,否则应该需要很多,比如1024. $ dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024 $ mkfs.ext4 rootfs.ext4 $ sudo mount rootfs.ext4 /mnt/ -o loop $ sudo cp -rf rootfs/* /mnt/ $ sudo umount /mnt/
5. 测试系统
编写启动脚本:
$ touch boot.sh $ chmod a+x boot.sh
修改为如下内容:
1 #!/bin/sh 2 3 qemu-system-aarch64 \ 4 -M virt \ 5 -cpu cortex-a53 \ 6 -nographic \ 7 -smp 1 \ 8 -m 512M \ 9 -kernel linux-5.10.7/arch/arm64/boot/Image \ 10 -append "rootwait root=/dev/vda rw console=ttyAMA0" \ 11 -netdev user,id=eth0 \ 12 -device virtio-net-device,netdev=eth0 \ 13 -drive file=rootfs.ext4,if=none,format=raw,id=hd0 \ 14 -device virtio-blk-device,drive=hd0
如果顺利的话,就可以正常进入系统了。
6.使用U-Boot
u-boot:
[https://ftp.denx.de/pub/u-boot/u-boot-2023.10.tar.bz2]
编译:
$ tar -xf u-boot-2023.10.tar.bz2 $ cd u-boot-2023.10/ $ CROSS_COMPILE=aarch64-linux-gnu- make qemu_arm64_defconfig $ CROSS_COMPILE=aarch64-linux-gnu- make -j4
启动系统:
#!/bin/sh qemu-system-aarch64 \ -M virt \ -cpu cortex-a53 \ -nographic \ -smp 1 \ -m 512M \ -bios u-boot-2023.10/u-boot.bin \ -kernel linux-5.10.7/arch/arm64/boot/Image \ -append "rootwait root=/dev/vda rw console=ttyAMA0" \ -netdev user,id=eth0 \ -device virtio-net-device,netdev=eth0 \ -drive file=rootfs.ext4,if=none,format=raw,id=hd0 \ -device virtio-blk-device,drive=hd0
正常情况下,先启动u-boot,再启动kernel,再启动跟文件系统。