前言
新冠疫情期间在家里无事可做,奈何手上没有现成的开发板,又想调试学习linux内核,于是就有了这一系列的文章。本系列文章包含以下内容:
- 在家学习嵌入式1-搭建qemu环境
- 在家学习嵌入式2-在qemu环境下使用uboot启动linux
- 在家学习嵌入式3-使用Buildroot构建编译系统
- 在家学习嵌入式4-Versatile Express开发板
- 在家学习嵌入式5-buildroot的使用
注意:这只是一个入门的文章,介绍自己如何一步步搭建qemu环境以及启动虚拟开发板。如果想要用现成的环境,可以去查看吴章金大牛发起的Linux lab 项目,那个项目做得非常的棒。
需求
作为嵌入式软件工程师,经常需要板子才能开发然后验证某些内容,这些东西在公司很容易实现。但是一回到家里,就没有这样的开发环境。因此,有没有这样一种仿真环境,支持某个虚拟的开发板,可以在上面跑uboot、linux kernel,从而进行uboot或kernel的调试而不必关心具体的外设器件。
QEMU介绍
QEMU
是一个支持各种目标处理器(例如x86,ARM,MIPS等)的模拟器
。当用作机器仿真器时,QEMU可以在另一台机器(例如x86 PC)上运行为一台机器(例如ARM板)制作的操作系统和程序。在本文中,将详细列举出如何一步步搭建QEMU
+ARM
的仿真环境,虚拟的开发板为vexpress-a9
。
QEMU环境搭建
软件版本
1 | PC:Ubuntu 16.04 |
安装QEMU
1 | sudo apt-get install qemu |
直接使用apt-get install
命令下载,没有参照网上说的下载源码编译。
下载linux kernel并切换到v4.4版本
1 | git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git |
安装arm交叉工具链
1 | sudo apt-get install gcc-arm-linux-gnueabi |
编译linux kernel
1 | make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig |
这里使用vexpress_defconfig
的配置,也就是使用vexpress-a9
的板子。据说QEMU
对这个板子支持比较好,具体的没有深入的研究。
根文件系统制作
- 编译busybox
1
2
3
4wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make install CROSS_COMPILE=arm-linux-gnueabi-
编译生成的bin文件在busybox-1.30.0/_install/
目录下。
创建根目录
1
mkdir -p rootfs/{dev,etc/init.d,lib}
拷贝bin文件到rootfs
1
cp -rf ./busybox-1.30.0/_install/* rootfs/
拷贝库文件到
rootfs/lib/
目录下1
cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/
创建
proc
和sys
目录等目录1
2
3
4mkdir rootfs/proc
mkdir rootfs/sys
mkdir rootfs/config
mkdir rootfs/debug
之所以要创建这两个目录,因为后面需要挂载procfs
和sysfs
两个文件系统。当然,这两个目录也可以在启动脚本中创建。
修改为root
1
sudo chown -R root:root rootfs/
创建4个tty终端设备
1
2
3
4sudo 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制作根文件系统镜像a9rootfs.ext4
1
dd if=/dev/zero of=a9rootfs.ext4 bs=1M count=32
格式化成ext4文件系统
1
mkfs.ext4 a9rootfs.ext4
将rootfs文件拷贝到文件系统中
1
2
3
4mkdir tempfs
sudo mount -t ext4 a9rootfs.ext4 tempfs/ -o loop
sudo cp -rf rootfs/* tempfs/
sudo umount tempfs/设置开机启动命令
1
2
3
4
5
6
7
8
9
10sudo vi rootfs/etc/init.d/rcS
写入以下内容:
!/bin/sh
mount -t sysfs sysfs /sys
mount -t proc procfs /proc
mount -t debugfs debugfsfs /debug
mount -t configfs configfs /config
mount -o rw,remount /
启动QEMU
1 | qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/victor/work/linux/linux/arch/arm/boot/zImage -dtb /home/victor/work/linux/linux/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "root=/dev/mmcblk0 console=ttyAMA0" -sd /home/victor/work/linux/a9rootfs.ext4 -serial stdio |
至此,就可以看到vexpress-a9
板子启动的kernel log,并且出来一个串口,并且可以看到小企鹅的界面出现,后面我们就可以使用这块虚拟的开发板学习linux graphic相关的内容了。
关于qemu-system-arm
命令各个参数详细解释如下:
-M vexpress-a9
:表示使用vexpress-a9
开发板的配置;-m 512M
:表示这只内存为512M;-kernel xxx/arch/arm/boot/zImage
:表示使用哪个内核镜像;-dtb xxx/arch/arm/boot/dts/vexpress-v2p-ca9.dtb
:表示使用哪个dtb文件;-nographic
:表示不启动图形化界面;-append
:表示设置kernel的cmdline;-sd xxx/a9rootfs.ext4
:表示使用sd卡上某个文件作为根文件系统;qemu-system-arm -M help
:可以查看支持的板子情况。
注意:在xshell远程ubuntu的使用使用-serial stdio
的参数会提示如下错误,在ubuntu使用则不会,具体原因未知。
1 | (qemu) qemu-system-arm: -serial stdio: cannot use stdio by multiple character devices |
在启动参数加入console=tty0
的时候,log会从图形界面输出来。
启动的kernel log如下:
1 | victor@victor-linux:~$ qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/victor/work/linux/linux/arch/arm/boot/zImage -dtb /home/victor/work/linux/linux/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -append "root=/dev/mmcblk0 console=ttyAMA0" -sd /home/victor/work/linux/a9rootfs.ext4 -nographic |
参考资料
- 从零使用qemu模拟器搭建arm运行环境
- Ubuntu 16.04 利用qemu模拟ARM开发板
- 嵌入式Linux之QEMU模拟器
- ARM Versatile Express Emulation On Qemu From Scratch
- U-boot: ARM Versatile Express Emulation On Qemu With NFS as Rootfs
- Versatile express Introduction
- RASPBERRY PI ON QEMU
- QEMU wiki
- QEMU wiki arm
- QEMU version 4.1.0 User Documentation
- QEMU Emulator User Documentation
- Embedded Linux From Scratch