LinMao's Blog
学习科研记录与分享!

用qemu模拟器搭建arm运行环境

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运行环境
赞(0) 打赏
转载请注明出处:LinMao's Blog(林茂的博客) » 用qemu模拟器搭建arm运行环境

评论 抢沙发

静态归档版本,评论功能已关闭。
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

LinMao's Blog(林茂的博客)

了解更多联系我们

觉得文章有用就打赏一下作者吧~

支付宝扫一扫打赏

支付宝

微信扫一扫打赏

微信