qemu 是一个在 linux 上广泛使用的可以模拟 ARM 的模拟器。在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是 16 到 32MB,而 CPU 的主频大概在 100MHz 到500MHz 之间。这种情况下,在 ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的 CPU 运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在 CPU 能力很强、存储空间足够的主机平台上(比如 PC 上)编译出针对其他平台的可执行程序。下面我们分别在ubuntu和windows上搭建arm运行环境。
ubuntu下搭建
host:ubuntu16.04
安装arm的交叉编译工具
打开终端输入安装命令:
sudo apt-get install gcc-arm-linux-gnueabi
安装完成后执行下面命令检查是否安装成功
dpkg -l gcc-arm-linux-gnueabi
出现下面输出表示安装成功
ii gcc-arm-linux-gn 4:5.3.1-1ubun amd64 GNU C compiler for the armel architec
编译Linux内核
下载linux内核
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内核
# 生成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下载源码安装方法,但是测试发现其实直接用源安装也可以
安装相关依赖:
sudo apt install zlib1g-dev
sudo apt install libglib2.0-0
sudo apt install libglib2.0-dev
安装qemu
sudo apt install qemu
测试qemu和内核是否运行成功
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文件中找到。
当输出显示
end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
表示内核成功加载,但是没有根文件系统,小面制作根文件系统
制作根文件系统
Linux发行版的根文件系统很复杂,而我们这里用到的根文件系统很简单,我们要制作的根文件系统 = busybox(包含基础的Linux命令) + 运行库 + 几个字符设备。 根文件系统依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。
下载busybox
wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2
编译安装busybox
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目录(根目录),根文件系统内的文件全部放到这里
mkdir -p rootfs/{dev,etc/init.d,lib}
拷贝busybox命令到根目录下
cp busybox-1.20.2/_install/* -r rootfs/
从工具链中拷贝运行库到lib目录下
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/
创建4个tty端终设备
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大小的磁盘镜像
qemu-img create -f raw disk.img 512M
格式化成ext4文件系统
mkfs -t ext4 ./disk.img
将文件拷贝到镜像中
mkdir tmpfs
sudo mount -o loop ./disk.img tmpfs/
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs
测试
启动qemu模拟系统进行测试
完成上述所有步骤之后,就可以执行下面命令启动qemu来模拟vexpress开发板了:
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,解决办法:
# 可以把
-append "root=/dev/mmcblk0 console=ttyAMA0"
# 改为
-append "root=/dev/mmcblk0 rw console=ttyAMA0"
运行hello world
在用户目录创建hello.c源码vim hello.c:
#include
int main()
{
printf("hello world!");
return 0;
}
用交叉编译工具编译程序
arm-linux-gnueabi-gcc-5 hello.c -o hello
将交叉编译后生成的文件加载到arm的根目录
cp hello rootfs/
sudo mount -t ext3 a9rootfs.ext3 tmpfs -o loop
sudo cp -r rootfs/* tmpfs
sudo umount tmpfs
再次启动qemu模拟系统测试程序
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的安装目录,执行命令创建硬盘镜像:
qemu-img.exe create arm64.img 10G
安装虚拟机
执行下面命令开始安装虚拟机
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:
从零使用qemu模拟器搭建arm运行环境
Ubuntu下用QEMU搭建ARM Linux运行环境
Ubuntu下用QEMU搭建ARM Linux运行环境
最新评论
感谢博主,让我PyTorch入了门!
博主你好,今晚我们下馆子不?
博主,你的博客用的哪家的服务器。
您好,请问您对QNN-MO-PYNQ这个项目有研究吗?想请问如何去训练自己的数据集从而实现新的目标检测呢?
where is the source code ? bomb1 188 2 8 0 0 hello world 0 0 0 0 0 0 1...
在安装qemu的过程中,一定在make install 前加入 sudo赋予权限。
所以作者你是训练的tiny-yolov3还是yolov3...
很有用