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,再启动跟文件系统。

posted @ 2023-04-04 14:41  this毛豆  阅读(466)  评论(0编辑  收藏  举报