QEMU是一款模拟嵌入式的开发环境,下面文章列举了搭建arm9架构开发环境的流程,具体操作起来还有几个小问题,这里记录一下。
地址: 从零使用qemu模拟器搭建arm运行环境 -海枫
下载linux内核:
采用vexpress_defconfig
单板的配置,很多搭建QEMU环境的笔记都是这个单板。这里需要内核版本高一点,文中用了3.16,当然是可以的,我开始用了2.6.38就不行。编译内核:
内核编译中有一个报错: return_address函数 redefinition
看了下代码 编译时不带下面条件,这个函数应该是无用的,直接定义为了空。
#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
函数定义在gedit arch/arm/kernel/return_address.c
中,
在gedit arch/arm/include/asm/ftrace.h
中又包含了一次
但当函数定义成空时,上面头文件中却又自己定义了一次,就导致了重复定义。
处理很简单,把头文件中的定义删了,还用包含就行。
#else
/*
extern inline void *return_address(unsigned int level)
{
return NULL;
}
*/
void *return_address(unsigned int);
#endif
安装QEMU:
ubuntu系统的话可以不用下载安装了,直接apt install 就行编译busyBox:
make install CROSS_COMPILE=arm-linux-gnueabi-
最好换下顺序:
make CROSS_COMPILE=arm-linux-gnueabi- install
不换顺序的话我这里生成不了 _install 目录,费解。。。
编译中报错误: RLIMIT_FSIZE 未定义
在 include\libbb.h 再包含一个头文件可以解决:
include <sys/resource.h>
完善文件系统
编译出来的文件系统还不完整,需要创建 proc sys etc等目录
新建 /etc/init.d/rcS文件,至少包含以下内容:
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mdev -s
生成文件系统
这里用下面命令生成 .gz的文件系统,然后用-initrd 加载比较好,
这样文件 系统是可读写的。
find . | cpio -o -H newc | gzip -9 > ../rootfs.gz
用文中ext3的文件系统,挂载后是只读的。最后,启动
#!/bin/sh
if [ $# != 2 ]
then
echo 'usage: go [path to zImage] [path to fileSystem]'
exit
fi
qemu-system-arm -m 128M -M vexpress-a9 -kernel $1 -serial stdio -initrd $2 -append "console=ttyAMA0 root=/dev/mmcblk0 rdinit=/sbin/init"
附另一篇参考:
QEMU模拟ARM嵌入式LINUX系统