文章目录
- 从0开始使用QEMU模拟ARM开发环境系列一览表
- 开发环境:
- 文章使用的资源:
- 可能需要安装的库:
- 交叉编译链安装:
- QEMU 安装
- 编译 Uboot 并仿真
- 编译uboot
- 仿真uboot
- 编译内核并仿真
- 编译内核
- 仿真内核
- 基于 busybox 制作rootfs并仿真
- 编译以及制作
- 为交叉编译工具链瘦身
- 仿真rootfs
从0开始使用QEMU模拟ARM开发环境系列一览表
开发环境:
Ubuntu 16.04
qemu 5.0.0
gcc-linaro-6.5.0
文章使用的资源:
包含:
qemu-5.0.0、u-boot 源码、linux-5.4.95内核、gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf交叉编译链、busybox-1.32.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 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
如果后面报GCC版本低了可从下面链接下载
拷贝 gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz
到 /opt/下 ,并解压重名为 arm-linux-gcc
主要为了简化路径
sudo tar xvf gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz
sudo mv gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf arm-linux-gcc
添加路径到 /etc/profile
sudo gedit /etc/profile
在 profile 最后加入
export PATH=/opt/arm-linux-gcc/bin:$PATH
然后
source /etc/profile
输入 arm- 并 tab 测试是否安装成功
QEMU 安装
链接https://download.qemu.org/ 下载QEMU( 我这边下载的 qemu-5.0.0.tar.xz)
解压并编译安装
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:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。
测试
qemu-img -V
输出:
qemu-img version 5.0.0
Copyright © 2003-2020 Fabrice Bellard and the QEMU Project developers
查看 QEMU 支持的板子
qemu-system-arm -M help
编译 Uboot 并仿真
编译uboot
下载链接 https://gitlab.denx.de/u-boot/u-boot 可以直接下载master分支,解压并进入其根目录编译
sudo make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
CROSS_COMPILE=arm-linux-gnueabihf- : 为使用的交叉编译工具链
vexpress_ca9x4_defconfig:可以 通过 ls ./configs/ 查看
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make clean && make vexpress_ca9x4_defconfig # 不需要改配置
make -j6
仿真uboot
sudo qemu-system-arm -M vexpress-a9 -m 256 -kernel ./u-boot -nographic
# -nographic 不使用图形化界面,仅仅使用串口
输入ctrl + A 后按 X
退出 QEMU
编译内核并仿真
编译内核
下载链接 https://www.kernel.org/ 我这边下载的是 linux-5.4.95, 解压并进入其根目录编译。
/arch/arm/configs 目录里的是各个厂商的内核配置文件
在 linux-5.4.95 根目录编译 执行
make vexpress_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
# 将内核编译时需要的配置文件写入内核了
注意 vexpress_defconfig 中设置了 CONFIG_CMDLINE="console=ttyAMA0"
可以输入 make menuconfig
对进行详细的配置,如有错,一般是缺少lib可根据提示安装
确保内核支持nfs功能:
File systems – > Network File systems
在 linux-5.4.95 根目录编译 执行
make -j6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
# 编译内核
仿真内核
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"
# -dtb 指定设备树,否则会失败
# -append "console=ttyAMA0" 内核启动參数。这里告诉内核vexpress单板执行。串口设备是哪个tty。
基于 busybox 制作rootfs并仿真
busybox 下载链接 https://busybox.net/ 解压并进入其根目录
编译以及制作
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make defconfig
make menuconfig
# 勾选 Settings-> [*] Build static binary (no shared libs)
make -j6
make install
通过 make install 命令把生成的根文件创建在顶层目录(busybox-1.32.1根目录) _install 下,如果是通过 make defconfig O=…/output 导出配置的,则在相应的output目录下进入 _install 目录
在busybox-1.32.1根目录创建文件 make_rootfs.sh
# File Name: make_rootfs.sh
##
#!/bin/sh
base=`pwd`
tmpfs=/_tmpfs
# 如果存在删除
sudo rm -rf rootfs
sudo rm -rf ${tmpfs}
sudo rm -f a9rootfs.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 && 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 2pro
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=100
# 如果提示 "No space left on device" 证明 dd 命令中 count 的大小不够,可以先进行瘦身
sudo mkfs.ext3 a9rootfs.ext3
sudo mkdir -p ${tmpfs}
sudo chmod 777 ${tmpfs}
sudo mount -t ext3 a9rootfs.ext3 ${tmpfs}/ -o loop
sudo cp -r rootfs/* ${tmpfs}/
sudo umount ${tmpfs}
为交叉编译工具链瘦身
sudo arm-linux-gnueabihf-strip ./* # 进入 rootfs/lib 中
du -h ./
输出
4.9M ./
仿真rootfs
拷贝 a9rootfs.ext3 文件 到 之前 内核 linux-5.4.95 根目录中 ,并在 其中打开终端输入下面命令进行仿真
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd ./a9rootfs.ext3
# 同样地,只要是 仿真kernle 就需要 指定设备树
希望我的文章对于大家有帮助,由于个人能力的局限性,文中可能存在一些问题,欢迎指正、补充!