(注意:QEMU的版本是2009/5/21 0:28:03 Michel pollet提交的版本, uboot是 2010/4/26 23:47:44 Michel Pollet 提交的版本
最下面,有這兩個版本的鏈接資源)
首先編譯QEMU:
cd qemu
./configure --target-list=arm-softmmu
make
編譯 UBOOT,這裡注意,我使用的是RTEMS 4.9的ARM編譯工具,使用
cd uboot
gedit Makefile #(將140行的 CROSS_COMPILE=arm-linux- 改為 CROSS_COMPILE=arm-rtems4.9-)
export PATH=/opt/rtems-4.9/bin:$PATH
make mini2440_config
make -j16
cp u-boot.bin ../qemu/mini2440
這個過程都很順利,緊接著噩夢來……
進入 qemu 文件夾下,輸入:
./mini2440/mini2440_start.sh
這裡有個問題:
1.如果在編譯QEMU時沒有安裝,即 make install,那麼需要打開mini2440/mini2440_start.sh,將第16行的 qemu-img 改為:$base/../qemu-img
2.如果編譯時安裝了QEMU,即有make install,不管這一步驟。
期待的畫面並沒有出來。取而代之的是:
/etc/qemu-ifup:could not launch network script
Could not initialize device 'tap'
於是開始漫長的尋找問題之旅,網上大部分是基於Ubuntu的,對於Fedora 8的很少有價值的解決方案:
1.有些網上說是內核沒有tun 模塊,但我是有的,輸入以下命令:
modprobe tun;lsmod | grep tun
系統顯示:tun 11713 0
2.有些網上說是/etc/net/tun的權限不對,輸入以下命令:
ls -l /dev/net/tun
crw-rw-rw- 1 root root 10, 200 2011-03-16 07:05 /dev/net/tun
很顯然,也不是。這裡注意一下,如果有些童鞋這步問題,可以采用以下命令解決:
mkdir /dev/net
mknod /dev/net/tun c 10 200
chmod 666 /dev/net/tun
3.關於/etc/qemu-ifup的腳本權限,已經輸入以下命令:
chmod 777 /etc/qemu-ifup
chmod 777 /etc/qemu-ifdown
4.需要安裝uml-utilies和bridge-utils:
對於Fedora 8,使用命令:
yum install bridge-utils
很輕松的安裝上了。
(有bridge-utils-1.2-2.Fedora 8.i386.rpm可以供下載
使用 rpm -U bridge-utils-1.2-2.Fedora 8.i386.rpm 安裝)
但uml-utilies安裝不是通過yum install uml-utilies,沒有這個包。
而是下載:uml-utilities-20040406-75.i586.rpm,
使用命令 rpm -U uml-utilities-20040406-75.i586.rpm
完成安裝的。這兩個包安裝完畢,系統裡才有tunctl、brctl命令。
依舊是:/etc/qemu-ifup:could not launch network script ……
這下傻眼了。仔細考慮一下,我認為是QEMU自身代碼的問題。
於是稍微跟蹤了一下代碼,發現qemu中的net.c代碼,第1023行的
static int launch_script(const char *setup_script, const char *ifname, int fd)函數老是返回 -1。
原來是第1045行的execv(setup_script, args);函數沒有成功啟動腳本,
加了打印函數,errno 是 8,即
ENOEXEC
The new process image file has the appropriate access permissions, but is not in the proper format.
意思是,權限沒有問題,但是格式不對。哦,難道是exec函數族不能直接啟動腳本?
呵呵,BUG,絕對的BUG。