懒人方式:
直接去方锐/qemu克隆项目,执行script目录的脚本即可
1. build_env.sh安装环境
2. build_rootfs.sh 生成rootfs
./build_rootfs.sh -b 先编译
./build_rootfs.sh -m 制作生成rootfs.ext3 和rootfs.img
3. build_kernel.sh编译kernel
./build_kernel.sh -m // make menuconfig 修改一下配置
./build_kernel.sh -d // 编译dts
./build_kernel.sh -k // 编译kernel
4. qemu_run.sh开始调试
./qemu_run.sh -r // 运行raw格式的rootfs
or
./qemu_run.sh -f // 运行带文件系统的rootfs
1. 安装工具和依赖
sudo apt-get install build-essential pkg-config zlib1g-dev libglib2.0-0 libglib2.0-dev libsdl1.2-dev libpixman-1-dev libfdt-dev autoconf automake libtool librbd-dev libaio-dev flex bison -y sudo apt-get install make sudo apt-get install gcc sudo apt-get install flex sudo apt-get install bison sudo apt-get install libncurses5-dev libssl-dev sudo apt-get install build-essential openssl sudo apt-get install zlibc minizip sudo apt-get install libidn11-dev libidn11 #交叉编译链 安装 sudo apt-get install gcc-arm-linux-gnueabihf sudo apt-get install g++-arm-linux-gnueabihf #交叉编译链 卸载 #sudo apt-get remove gcc-arm-linux-gnueabihf #sudo apt-get remove g++-arm-linux-gnueabihf sudo apt-get install gcc-10-aarch64-linux-gnu # 为方便使用可以软连接或者重命名aarch64-linux-gnu-gcc-10 mv /usr/bin/aarch64-linux-gnu-gcc-10 /usr/bin/aarch64-linux-gnu-gcc sudo apt-get install gcc-arm-linux-gnueabi
2.rootfs的构建
2.1busybox代码的下载编译
Busybox下载地址:https://busybox.net/downloads/
Download 1.36.0
cd busybox #arm-linux-gnueabi- 是arm32的交叉编译工具链 make menuconfig CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm 或 export ARCH=arm64 export CROSS_COMPILE=aarch64-none-linux-gnu- export CROSS_COMPILE=aarch64-linux-gnu- make menuconfig #设置Busybox Busybox Settings ---> Build Options ---> [ *]Build BusyBox as a static binary (no shared libs) make -j16 make install
Busybox 默认会安装到 ./_install 目录下
制作rootfs之前,确认下busybox的架构是不是arm架构,否则运行时会报错
$file busybox busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, stripped
2.2. rootfs的制作
拷贝生成的_install文件到rootfs下
cd busybox-1_36_0
#!/bin/sh # File Name: make_rootfs.sh ## base=`pwd` tmpfs=$1 echo "tmpfs: " $tmpfs # 如果存在删除 sudo rm -rf rootfs sudo rm -rf ${tmpfs} sudo rm -f rootfs.ext3 sudo mkdir rootfs # 拷贝 _install 中文件 到 rootfs sudo cp _install/* rootfs/ -raf #sudo mkdir -p rootfs/{lib,proc,sys,tmp,root,var,mnt} cd rootfs sudo mkdir -p lib proc sys tmp root var mnt sudo ln -s bin/busybox init cd ${base} # 根据自己的实际情况, 找到并 拷贝 arm-gcc 中的 libc中的所有.so 库 # sudo cp -arf /opt/arm-linux-gcc/arm-linux-gnueabihf/lib/* rootfs/lib sudo cp examples/bootfloppy/etc rootfs/ -arf sudo sed -r "/askfirst/ s/.*/::respawn:-\/bin\/sh/" rootfs/etc/inittab -i sudo mkdir -p rootfs/dev/ sudo mknod rootfs/dev/tty1 c 4 1 sudo mknod rootfs/dev/tty2 c 4 2 sudo mknod rootfs/dev/tty3 c 4 3 sudo mknod rootfs/dev/tty4 c 4 4 sudo mknod rootfs/dev/ttyAMA0 c 204 64 sudo mknod rootfs/dev/console c 5 1 sudo mknod rootfs/dev/null c 1 3 sudo chmod 666 rootfs/dev/ttyAMA0 sudo chmod 666 rootfs/dev/console #制作ext3格式的根文件系统,生成rootfs.ext3 sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=128 # 如果提示 "No space left on device" 证明 dd 命令中 count 的大小不够,可以先进行瘦身 sudo mkfs.ext3 rootfs.ext3 sudo mkdir -p ${tmpfs} sudo chmod 777 ${tmpfs} sudo mount -t ext3 rootfs.ext3 ${tmpfs}/ -o loop sudo cp -r rootfs/* ${tmpfs}/ sudo umount ${tmpfs} #制作raw格式的最小根文件系统镜像,生成rootfs.img cd rootfs find . | cpio -o -H newc | gzip > ../rootfs.img cd ${base}
3.uboot下载编译和QEMU启动
Uboot官方下载 :https://ftp.denx.de/pub/u-boot/ 或者用下面命令克隆uboot代码
git clone https://source.denx.de/u-boot/u-boot.git uboot代码的编译
3.1 QEMU ARM32 uboot
以Arm32 vexpress machine为例
cd uboot arm-linux-gnueabi- 是arm32的交叉编译工具链
make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make -j64 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
#u-boot QEMU启动 qemu-system-arm \ -M vexpress-a9 \ -cpu cortex-a9 \ -smp 1 \ -m 1G \ -kernel u-boot \ -nographic 3.2 QEMU ARM64 Uboot
以virt machine 为例,
export ARCH=arm64 export CROSS_COMPILE=aarch64-none-linux-gnu- make qemu_arm64_defconfig make -j16
QEMU启动
qemu-system-aarch64 \ -M virt \ -cpu cortex-a72 \ -smp 2 \ -m 2048M \ -kernel u-boot \ -nographic
直接加载uboot到内存启动,通过uboot命令加载kernel(命令行中将kernel img 带入)
-drive if=pflash,format=raw,index=1,file=flash.img
指向kernel img ,需转换boot认识的image
4. Linux Kernel代码下载和QEMU启动
Linux内核官网下载:https://mirrors.edge.kernel.org/pub/linux/kernel/
kerrnel版本5.14-rc5
4.1 ARM32的qemu kernel
arm-linux-gnueabi- 是arm32的交叉编译工具链
make menuconfig 编译kernel时需要选择rootfs中编译生成的文件路径,不然开机挂载rootfs时会出错 General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support (../busybox-1.36.1/rootfs) Initramfs source file(s)
cd linux_kernel make vexpress_defconfig CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm make bzImage ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16 make dtbs
qemu启动方式-raw格式
qemu-system-arm \ -M vexpress-a9 \ -m 512M \ -kernel ./zImage \ -dtb ./vexpress-v2p-ca9.dtb \ -append "console=ttyAMA0" \ -initrd rootfs.img \ -nographic
-initrd 后面需要是raw格式的img
qemu启动方式-filesystem方式
sudo qemu-system-arm \ -M vexpress-a9 \ -m 512M \ -kernel ./zImage \ -dtb ./vexpress-v2p-ca9.dtb \ -append "root=/dev/mmcblk0 console=ttyAMA0" \ -sd rootfs.ext3 \ -nographic
-sd 后面的image需要是带文件系统格式的
4.2 ARM64的qemu kernel
cd linux_kernel
make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- Image -j32
qemu启动ARM64 kernel
qemu-system-aarch64 \ -machine virt,virtualization=true,gic-version=3 \ -m size=1024M \ -cpu cortex-a72 \ -smp 4 \ -kernel ./Image \ -initrd rootfs.img \ --append "console=ttyAMA0" \ -nographic
5. 制作QEMU+Uboot+kernel的SD镜像启动
#创建空的SD镜像 dd if=/dev/zero of=boot.disk bs=1M count=1024
#创建GPT分区,一个用来存放kernel和设备树,另一个存放根文件系统 sgdisk -n 0:0:+100M -c 0:kernel boot.disk sgdisk -n 0:0:0 -c 0:rootfs boot.disk
#查看分区 sgdisk -p boot.disk
#寻找一个空闲的loop设备 losetup -f
#将SD卡镜像映射到loop设备上 sudo losetup /dev/loop8 boot.disk sudo partprobe /dev/loop8
#格式化 sudo mkfs.ext4 /dev/loop8p1 sudo mkfs.ext4 /dev/loop8p2
#挂载 mkdir p1 mkdir p2 sudo mount -t ext4 /dev/loop8p1 p1/ sudo mount -t ext4 /dev/loop8p2 p2/
#拷贝文件并制作根文件系统 sudo cp ./zImage p1/ sudo cp ./vexpress-v2*.dtb p1/ sudo cp -raf ./_install/* ./p2
#创建4个tty设备(c代表字符设备,4是主设备号,1~4分别是次设备号) sudo mkdir -p p2/dev sudo mknod p2/dev/tty1 c 4 1 sudo mknod p2/dev/tty2 c 4 2 sudo mknod p2/dev/tty3 c 4 3 sudo mknod p2/dev/tty4 c 4 4
#创建终端和回收站 sudo mknod -m 666 p2/console c 5 1 sudo mknod -m 666 p2/null c 1 3
#卸载 sudo umount p1 p2 sudo losetup -d /dev/loop8
#启动uboot qemu-system-arm -M vexpress-a9 -m 1024M -smp 1 -nographic -kernel u-boot
#进入uboot命令行,切换mmc dev号 mmc dev 0
#从SD分区load zImage和dtb load mmc 0:1 0x60008000 zImage
load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb
或者 ext4load mmc 0:1 0x60008000 zImage ext4load mmc 0:1 0x61000000 vexpress-v2p-ca9.dtb
#设置内核启动参数 setenv bootargs 'root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlycon console=tty0 console=ttyAMA0 init=/linuxrc ignore_loglevel' #启动内核 bootz 0x60008000 - 0x61000000
否可以实现一条qemu命令将uboot,kernel,rootfs 启动?
6.QEMU 安装
链接https://download.qemu.org/ 下载QEMU( 我这边下载的 qemu-5.0.0.tar.xz)
解压并编译安装文章来源:https://www.toymoban.com/news/detail-787150.html
tar xf qemu-5.0.0.tar.xz cd qemu-5.0.0 ./configure --prefix=/usr/local/qemu --target-list=arm-softmmu --audio-drv-list= sudo make && sudo make install sudo ln -s /usr/local/qemu/bin/* /usr/local/bin/ # --target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。
apt-get install qemu qemu-system qemu-user文章来源地址https://www.toymoban.com/news/detail-787150.html
到了这里,关于ARM Linux 调试 -QEMU启动 Uboot/Kernel/Rootfs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!