QEMU是一款模擬嵌入式的開發(fā)環(huán)境,下面文章列舉了搭建arm9架構(gòu)開發(fā)環(huán)境的流程,具體操作起來還有幾個小問題,這里記錄一下。
地址: 從零使用qemu模擬器搭建arm運行環(huán)境 -海楓
下載linux內(nèi)核:
采用vexpress_defconfig單板的配置,很多搭建QEMU環(huán)境的筆記都是這個單板。這里需要內(nèi)核版本高一點,文中用了3.16,當然是可以的,我開始用了2.6.38就不行。編譯內(nèi)核:
內(nèi)核編譯中有一個報錯: return_address函數(shù) redefinition
看了下代碼 編譯時不帶下面條件,這個函數(shù)應該是無用的,直接定義為了空。
#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
函數(shù)定義在gedit arch/arm/kernel/return_address.c中,
在gedit arch/arm/include/asm/ftrace.h中又包含了一次
但當函數(shù)定義成空時,上面頭文件中卻又自己定義了一次,就導致了重復定義。
處理很簡單,把頭文件中的定義刪了,還用包含就行。
#else
/*
extern inline void *return_address(unsigned int level)
{
return NULL;
}
*/
void *return_address(unsigned int);
#endif
安裝QEMU:
ubuntu系統(tǒng)的話可以不用下載安裝了,直接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>完善文件系統(tǒng)
編譯出來的文件系統(tǒng)還不完整,需要創(chuàng)建 proc sys etc等目錄
新建 /etc/init.d/rcS文件,至少包含以下內(nèi)容:
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mdev -s
生成文件系統(tǒng)
這里用下面命令生成 .gz的文件系統(tǒng),然后用-initrd 加載比較好,
這樣文件 系統(tǒng)是可讀寫的。
find . | cpio -o -H newc | gzip -9 > ../rootfs.gz
用文中ext3的文件系統(tǒng),掛載后是只讀的。最后,啟動
#!/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系統(tǒng)