Qemu Mini2440 的 Linux Fedora 下网络配置

发布者:leader4最新更新时间:2024-07-02 来源: elecfans关键字:Qemu  Mini2440  Linux  Fedora  网络配置 手机看文章 扫描二维码
随时随地手机看文章

最近应朋友的要求,研究一下QEMU MINI2440下的仿真。本来我以为这个过程没什么的,这一研究还真发现不少问题,写出来与大家分享。

我使用的系统环境:
1.使用VMware 6.5,宿主机使用 win 7
2.VMWare 6.5上的系统是 Linux Fedora 8
3.RTEMS 的编译环境 4.9

首先我从以下网站获取源代码

1.获取QEMU的源代码:git clone git://repo.or.cz/qemu/mini2440.git  qemu
2.获取UBOOT的源代码git clone git://repo.or.cz/u-boot-openmoko/mini2440.git uboot

(注意: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。


于是更改代码如下:

static int launch_script(const char *setup_script, const char *ifname, int fd)
{
    int pid, status;
    char *args[4]; /* bacon modified */
    char **parg;

        /* try to launch network script */
        pid = fork();
        if (pid >= 0) {
            if (pid == 0) {
            char path[20];/* bacon add */
                int open_max = sysconf (_SC_OPEN_MAX), i;
                for (i = 0; i < open_max; i++)
                    if (i != STDIN_FILENO &&
                        i != STDOUT_FILENO &&
                        i != STDERR_FILENO &&
                        i != fd)
                        close(i);

                parg = args;
                strcpy(path, '/bin/bash');/*bacon add*/

                *parg++ = (char *)path; /*bacon add*/
                *parg++ = (char *)setup_script;
                *parg++ = (char *)ifname;
                *parg++ = NULL;

                status = execv(path, args);/*bacon add*/
                fprintf(stderr, 'error:%d %d %d %s %sn', status, errno, ENOEXEC, setup_script, ifname);/*bacon add for debug.*/

                _exit(1);
            }
            while (waitpid(pid, &status, 0) != pid);
            if (!WIFEXITED(status) ||
                WEXITSTATUS(status) != 0) {
                fprintf(stderr, '%s: could not launch network scriptn',
                        setup_script);
                return -1;
            }
        }
    return 0;
}

键入命令:
make;./mini2440/mini2440_start.sh

脚本提示找不到tunctl命令和ifconfig命令。
呵呵,这个意思是路径有问题。代码里的路径我仔细检查了,没有问题。可以考虑是脚本qemu-ifup和qemu-ifdown中的路径出问题了。
于是全部命令使用绝对路径。我的qemu-ifup的脚本内容如下:

/usr/bin/tunctl -t $1
/sbin/ifconfig $1 10.0.0.4 netmask 255.255.255.0 up
sleep 2

我的qemu-ifdown的脚本内容如下:

/sbin/ifconfig $1 down
/usr/bin/tunctl -d $1
sleep 2

使用10.0.0.4是为了省事情。uboot默认服务器的地址就是10.0.0.4,呵呵,就可以不用在uboot里键入一大堆命令了。注意sleep是必须的,fork之后子进程一下运行完毕就退出了,而父进程会得到错误结果,认为脚本未执行而失败。

我又安装了一个tftp服务器,测试uboot 的网络启动功能,顺利完成。

(可以参考牛人 http://fpcfjf.blog.163.com/blog/static/554697932009419103226814/ 的博文实现)
有些朋友可能需要qemu能从主机的网络访问Internet或真实的局域网,配置过程也不复杂。我会在后续的博文里写道。最后,有图有真相……

最最后,考虑到一些朋友刚开始搞这些东西,找起来不方便。我已经为大家打好了包,上传到LinuxIDC.com的1号FTP服务器上。

下载地址:

FTP地址:ftp://www.linuxidc.com

用户名:www.linuxidc.com

密码:www.muu.cc

在 2011年LinuxIDC.com3月Qemu Mini2440 的 Linux Fedora 下网络配置

下载方法见 http://www.linuxidc.net/thread-1187-1-1.html

1.包含QEMU仿真mini2440的代码,已经打好补丁
2.包含qemu-ifup和qemu-ifdown的脚本
3.包含一个TFTP服务器和xinetd服务的代码
4.包含操作虚拟网卡的tunctl命令和操作网桥的brctl命令

5.Uboot 源代码。
6.以上所有工具在Linux Fedora 8 下调试通过


关键字:Qemu  Mini2440  Linux  Fedora  网络配置 引用地址:Qemu Mini2440 的 Linux Fedora 下网络配置

上一篇:mini2440开发板Linux系统自动挂载U盘与SD卡失败的解决方法
下一篇:构建MINI2440开发板Ubuntu开发环境

推荐阅读最新更新时间:2026-03-13 06:01

ecos on QEMU for mini2440 编译方法
1. Redboot的编译方法 ecosconfig new mini2440 redboot ecosconfig tree make 2. ecos 内核的编译方法 ecosconfig new mini2440 ecosconfig tree make 3.ecos的测试方法 在下载好的cos源码中的根目录有examples 进入这个目录 make INSTALL_DIR=你的ecos里面的install目录的绝对路径 会生成几个可执行文件。 修改qemu.sh,举例: ./qemu-system-arm -M mini2440 -m 128M -kernel examples/twothreads -show-curs
[单片机]
ecos on <font color='red'>QEMU</font> for <font color='red'>mini2440</font> 编译方法
GUI 在 MINI2440 QEMU 的eCos 上的移植
经历了redboot, kernel测试,网卡驱动,web server的测试,很自然的我们想到了UI。 这不仅仅是移植一个GUI, 更重要的让MINI2440 QEMU的ecos仿真平台更加完整话。 对emwin的移植,需要两个部分,老生常谈了网上到处都是。 (本移植也只是针对学习和测试,并非商业用途) 1. LCD的驱动 这个请网上搜索,MINI2440 LCD Driver就可以。 2. GUI的OS接口 探究emwin的OS接口部分,我们需要利用ecos的两个同步资源 cyg_semaphore cyg_flag 还有一些thread的操作函数 cyg_thread_delay cyg_thread_ge
[单片机]
GUI 在 <font color='red'>MINI2440</font> <font color='red'>QEMU</font> 的eCos 上的移植
linux-2.6.32在mini2440开发板上移植 移植I2C-EEPROM 驱动
1 在内核中配置I2C 驱动 Linux-2.6.32.2 对S2C2440 的I2C 接口提供了完善的驱动,因此我们只需在内核中配置一下即可使用。 在内核源代码目录执行:make menuconfig,进入内核配置主菜单,依次选择进入如下子菜单: Device Drivers --- * I2C support --- I2C Hardware Bus support --- 如图,我们看到这里已经选择好了“ * S3C2410 I2C Driver”,这里的S3C2410 也可以适用于S3C2440,因为它们的I2C 端口及寄存器定义都是完全相同的。 以上配置所对
[单片机]
<font color='red'>linux</font>-2.6.32在<font color='red'>mini2440</font>开发板上移植 移植I2C-EEPROM 驱动
Qt-embedded-linux-opensource-src-4.5.1移植到mini2440开发板技术说明
用过友善之臂的朋友都知道,友善之臂mini2440内置的是qt2的界面设计,但是现在q4逐渐成为主流。如何把qt4成功移植到mini2440非常不容易,本人也费了很到的功夫才完成了这样的工程。现在我把自己的经验拿出来与大家分享,希望有兴趣的朋友少走弯路。 1.我的环境及所需资源: PC机操作系统: Ubuntu 交叉编译工具:arm-linux-gcc-4.3.2.tar.gz 所需资源: tslib-1.4.tar.gz qt-embedded-linux-opensource-src-4.5.1.tar.gz qt-x11-linux-opensource-src-4.5.1.tar.gz 2.安装
[单片机]
ARM-Linux开机自启动设置-mini2440开发板
要在开发板上的Linux开机启动自己的程序,想着简单,却改了很久,绕了一圈下来确实很简单,只是自己一开始太过迂腐吧! 如果不想看完全文,这一段应该就够了,从我使用的开发板的角度讲,一般只要在/etc/init.d/rcS中加入你的程序或者脚本命令就可以实现开机自动运行;想在超级终端输入回车,登录后执行,则可以在/etc/profile中加入命令;如果想去掉每次开机完后的“Please press Enter to activate this console”这句,也就是实现开机自动登录,可以在/etc/inittab中仿照busybox中example的inittab写,只是将::askfirst:-/bin/sh改为::resp
[单片机]
Linux中SPI子系统图解和mini2440下的SPI驱动移植
1.SPI子系统框图详解: SPI总线上有两类设备:一类是主控端,通常作为SOC系统的一个子模块出现,比如很多嵌入式MPU中都常常包含SPI模块。一类是受控端,例如一些SPI接口的Flash、传感器等等。主控端是SPI总线的控制者,通过使用SPI协议主动发起SPI总线上的会话。而受控端则被动接受SPI主控端的指令,并作出响应的响应。 如图1所示,linux下的spi子系统主要涉及3个部分:spi核心、spiprotocol驱动和spi主控制器驱动。如图1.1,spi核心负责抽象出所有控制器都具备的功能代码,同时向上为spiprotocol驱动提供接口比如spi_message、spi_transfer,spi_async等,具
[单片机]
<font color='red'>Linux</font>中SPI子系统图解和<font color='red'>mini2440</font>下的SPI驱动移植
linux-2.6.32在mini2440开发板上移植-移植I2C-EEPROM 驱动
1 在内核中配置I2C 驱动 Linux-2.6.32.2 对S2C2440 的I2C 接口提供了完善的驱动,因此我们只需在内核中配置一下即可使用。 在内核源代码目录执行:make menuconfig,进入内核配置主菜单,依次选择进入如下子菜单: Device Drivers --- * I2C support --- I2C Hardware Bus support --- 如图,我们看到这里已经选择好了“ * S3C2410 I2C Driver”,这里的S3C2410 也可以适用于S3C2440,因为它们的I2C 端口及寄存器定义都是完全相同的。 以上配置所对
[单片机]
<font color='red'>linux</font>-2.6.32在<font color='red'>mini2440</font>开发板上移植-移植I2C-EEPROM 驱动
linux-2.6.32在mini2440开发板上移植-SD卡驱动移植
1 在内核中注册SD 设备驱动 Linux-2.6.32.2 已经自带了S3C2440 芯片的SD 卡驱动,我们只需在初始化代码中加入SD 平台设备结构就可以,打开arch/arm/mach-s3c2440/mach-mini2440.c,在nand flash 平台结构后面添加如下红色代码: ;在mini2440.c 的顶部添加SD 卡设备结构所需的头文件 #include linux/mmc/host.h #include plat/mci.h static struct platform_device mini2440_device_eth = { .name = dm9000 , .id = -1, .num_resour
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved