84590298 2011-03-26
(注意: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。