qemu 是一个在 linux 上广泛使用的可以模拟 ARM 的模拟器。在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是 16 到 32MB,而 CPU 的主频大概在 100MHz 到500MHz 之间。这种情况下,在 ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的 CPU 运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在 CPU 能力很强、存储空间足够的主机平台上(比如 PC 上)编译出针对其他平台的可执行程序。下面我们分别在ubuntu和windows上搭建arm运行环境。
ubuntu下搭建
host:ubuntu16.04
安装arm的交叉编译工具
打开终端输入安装命令:
1 2 |
sudo apt-get install gcc-arm-linux-gnueabi |
安装完成后执行下面命令检查是否安装成功
1 2 |
dpkg -l gcc-arm-linux-gnueabi |
出现下面输出表示安装成功
1 2 |
ii gcc-arm-linux-gn 4:5.3.1-1ubun amd64 GNU C compiler for the armel architec |
编译Linux内核
下载linux内核
1 2 3 4 5 6 |
mkdir linux_kernel cd linux_kernel wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.13.tar.xz xz -d linux-4.13.tar.xz tar xvf linux-4.13.tar |
编译linux内核
1 2 3 4 5 6 |
# 生成vexpress开发板子的config文件: make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig # 编译: make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm # 生成的内核镜像位于arch/arm/boot/zImage,后续qemu启动时需要使用该镜像。 |
安装qemu模拟器
网上有直接很多现在qemu下载源码安装方法,但是测试发现其实直接用源安装也可以
安装相关依赖:
1 2 3 4 |
sudo apt install zlib1g-dev sudo apt install libglib2.0-0 sudo apt install libglib2.0-dev |
安装qemu
1 2 |
sudo apt install qemu |
测试qemu和内核是否运行成功
1 2 |
qemu-system-arm -M vexpress-a9 -m 512M -kernel /path_to_kernel_dir/arch/arm/boot/zImage -dtb /path_to_kernel_dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0" |
上面是一条命令,其中:
/path_to_kernel_dir/
是指内核编译目录
-M vexpress-a9
是模拟vexpress-a9单板,可以使用-M ?
餐胡来查询qemu支持的单板
-m 512M
指单板运行的物理内存
-kernel /path_to_kernel_dir/arch/arm/boot/zImage
指定qemu单板运行内核镜像
-nographic
指不使用图形化界面,只使用串口
-append "console=ttyAMA0"
内核启动参数,这里告诉内核vexpress单板运行,串口设备是那个tty。
内核启动参数中的console=参数应该填上哪个tty,因为不同单板串口驱动类型不尽相同,创建的tty设备名当然也是不相同的。那vexpress单板的tty设备名填什么,可以从生成的.config文件CONFIG_CONSOLE宏找到。
如果搭建其它单板,需要注意内核启动参数的console=参数值,同样地,可从生成的.config文件中找到。
当输出显示
1 2 |
end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) |
表示内核成功加载,但是没有根文件系统,小面制作根文件系统
制作根文件系统
Linux发行版的根文件系统很复杂,而我们这里用到的根文件系统很简单,我们要制作的根文件系统 = busybox(包含基础的Linux命令) + 运行库 + 几个字符设备。 根文件系统依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。
下载busybox
1 2 |
wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2 |
编译安装busybox
1 2 3 4 5 6 |
tar xjvf busybox-1.27.2.tar.bz2 cd busybox-1.27.2 make defconfig make CROSS_COMPILE=arm-linux-gnueabi- make install CROSS_COMPILE=arm-linux-gnueabi- |
安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。
形成根目录结构
先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录
创建rootfs目录(根目录),根文件系统内的文件全部放到这里
1 2 |
mkdir -p rootfs/{dev,etc/init.d,lib} |
拷贝busybox命令到根目录下
1 2 |
cp busybox-1.20.2/_install/* -r rootfs/ |
从工具链中拷贝运行库到lib目录下
1 2 |
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/ |
创建4个tty端终设备
1 2 3 4 5 |
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 |
制作根文件系统镜像
生成512M大小的磁盘镜像
1 2 |
qemu-img create -f raw disk.img 512M |
格式化成ext4文件系统
1 2 |
mkfs -t ext4 ./disk.img |
将文件拷贝到镜像中
1 2 3 4 5 |
mkdir tmpfs sudo mount -o loop ./disk.img tmpfs/ sudo cp -r rootfs/* tmpfs/ sudo umount tmpfs |
测试
启动qemu模拟系统进行测试
完成上述所有步骤之后,就可以执行下面命令启动qemu来模拟vexpress开发板了:
1 2 |
qemu-system-arm -M vexpress-a9 -m 512M -kernel /path_to_kernel_dir/arch/arm/boot/zImage -dtb /path_to_kernel_dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3 |
执行命令内核启动打印完后,命令行出现命令提示符,说明基本安装完成,接下来执行在主机上交叉编译的代码
执行上面的问题发现arm系统中文件不能编辑,提示read-only file system
,解决办法:
1 2 3 4 5 |
# 可以把 -append "root=/dev/mmcblk0 console=ttyAMA0" # 改为 -append "root=/dev/mmcblk0 rw console=ttyAMA0" |
运行hello world
在用户目录创建hello.c源码vim hello.c
:
1 2 3 4 5 6 7 |
#include <stdio.h> int main() { printf("hello world!"); return 0; } |
用交叉编译工具编译程序
1 2 |
arm-linux-gnueabi-gcc-5 hello.c -o hello |
将交叉编译后生成的文件加载到arm的根目录
1 2 3 4 5 |
cp hello rootfs/ sudo mount -t ext3 a9rootfs.ext3 tmpfs -o loop sudo cp -r rootfs/* tmpfs sudo umount tmpfs |
再次启动qemu模拟系统测试程序
1 2 |
qemu-system-arm -M vexpress-a9 -m 512M -kernel /path_to_kernel_dir/arch/arm/boot/zImage -dtb /path_to_kernel_dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3 |
命令行中输入 ./hello
可以看到输出hello world!,说明gemu模拟的arm环境成功。
windows下搭建
Windows 10
qemu安装ARM64 debain linux
安装qemu
qemu官网下载windows版安装程序。
下载debian mirrors
iso镜像
http://mirrors.163.com/debian/dists/Debian9.8/main/installer-arm64/current/images/netboot/mini.iso
内核文件
http://mirrors.163.com/debian/dists/Debian9.8/main/installer-arm64/current/images/netboot/debian-installer/arm64/linux
ramfs映像文件
http://mirrors.163.com/debian/dists/Debian9.8/main/installer-arm64/current/images/netboot/debian-installer/arm64/initrd.gz
安装控制台ComEmu作为控制台
去ComEmu官网下载安装程序。
创建硬盘映像
打开ComEmu控制台,注意要用管理员权限打开。
界面如下:
然后cd到qemu的安装目录,执行命令创建硬盘镜像:
1 2 |
qemu-img.exe create arm64.img 10G |
安装虚拟机
执行下面命令开始安装虚拟机
1 2 |
qemu-system-aarch64.exe -machine virt-2.9 -cpu cortex-a57 -kernel linux -initrd initrd.gz -cdrom mini.iso -hda arm64.img -m 1024 -append "root=/dev/ram console=ttyAMA0" -nographic |
注意上面下载的debain mirrors的路径,安装的所有步骤如下图所示:
安装过程中tab键来选择选择区域,字母键来进行选择,enter键确认然后进行下一步;根据提示进行选择,确实不清楚就按默认选择就可以。
安装完后进图命令好界面就就算安装完成。
Reference:
最新评论
感谢博主,让我PyTorch入了门!
博主你好,今晚我们下馆子不?
博主,你的博客用的哪家的服务器。
您好,请问您对QNN-MO-PYNQ这个项目有研究吗?想请问如何去训练自己的数据集从而实现新的目标检测呢?
where is the source code ? bomb1 188 2 8 0 0 hello world 0 0 0 0 0 0 1 1 9?5
在安装qemu的过程中,一定在make install 前加入 sudo赋予权限。
所以作者你是训练的tiny-yolov3还是yolov3...
很有用