Linux Fedora21 下QEMU虚拟MINI2440 的配置与搭建

 注:本文是个人经过网上收集资料外加亲身实践总结所写,所有参考均已注明出处,如若有未注明、遗漏或者错误的地方,还请批评指责,不吝赐教。

 

Step1,获取qemu for mini2440以及mini2440 u-boot的源码

 

主要有两种方法:

 

(1)有直接下载,解压安装

下载网址有

https://code.google.com/p/ (Google国内被封,不可用)

http://repo.or.cz/w/qemu/mini2440.git(经测试可用)

 

(2)通过git clone 直接联网下载

gitclone git://repo.or.cz/qemu/mini2440.git  qemu

gitclone git://repo.or.cz/u-boot-openmoko/mini2440.git uboot

这里是参考网上大多数人的写法,此外,这两句的最后如果不加qemu 和uboot也可以下载的,实在不知道这两个后缀有什么用,但是为了安全起见,还是加上为好。

 

Step2,编译安装qemu,进入qemu的源码目录

 

./configure--target-list=arm-softmmu
make

 

Configure的时候出现错误:

can'topen include file : SDL.h和

ERROR:QEMU requires SDL or Cocoa for graphical output
To build QEMU without graphical output configure with --disable-gfx-check
Note that this will disable all output from the virtual graphics card
except through VNC or curses

这里网上百度了一下,

解决办法:

yuminstall SDL-devel SDL-static

yuminstall install zlib1g-dev

其实只要执行第一个命令即可,我的第二个库文件已经安装过了,

主要参考了两个博客,

http://blog.csdn.net/openme_openwrt/article/details/7950685

http://blog.csdn.net/a593796769/article/details/9112667

 

然后make

又出现错误:

vl.o:In function `dynticks_start_timer':

/root/qemu/vl.c:1549:undefined reference to `timer_create'

vl.o:In function `dynticks_rearm_timer':

/root/qemu/vl.c:1584:undefined reference to `timer_gettime'

/root/qemu/vl.c:1597:undefined reference to `timer_settime'

vl.o:In function `dynticks_stop_timer':

/root/qemu/vl.c:1567:undefined reference to `timer_delete'

collect2:error: ld returned 1 exit status

Makefile:722:recipe for target 'qemu-system-arm' failed

make[1]:*** [qemu-system-arm] Error 1

Makefile:58:recipe for target 'subdir-arm-softmmu' failed

make:*** [subdir-arm-softmmu] Error 2

网上解释说,此处是由于缺少相应的第三方库函数librt.a,但是解决方法真的是各种各样,又说link时加一个-lrt,也有说把makefile 里

# Dowe need librt 这部分修改掉的,试来试去还是在一篇英文网站找到的答案,具体解决方法:

在makefile和makefile.configure里LIBS+=-lz 的后面 直接添加-lrt –lm
即LIBS+=-lz -lrt –lm
,到底是老外的东西,人家玩的果然比我们好,记得要两个文件同时添加,搞定
参考网址http://stackoverflow.com/questions/18286738/undefined-reference-to-symbol-timer-settimeglibc-2-3-3
 
然后再执行make或make –j4 (据说这个执行比较快)

顺利编译通过

安装:makeinstall

 

Step3,配置编译mini2440的u-boot

 

注,此处参考coolbacon(雪松’s RTEMS)的比较多,但是原文有一处错误,后面会有说明
cd uboot
同雪松博客里所讲,我用的是最新的rtems4.11
因此
gedit Makefile  
#(将140行的 CROSS_COMPILE=arm-linux- 改为 CROSS_COMPILE=arm-rtems4.11-)
将交叉编译工具加入PATH
export PATH=$HOME/development/rtems/4.11/bin:$PATH
接着执行:
make mini2440_config
make -j16
 
再把生成的u-boot.bin copy到qemu/mini2440文件夹下面
然后执行./mini2440/mini2440_start.sh
接下来遇到的是和bacon一样的问题
/etc/qemu-ifup:could not launch network script
Could not initialize device 'tap'
 
详情请看
http://blog.csdn.net/coolbacon/article/details/6252938
 
下面我要讲的是我和coolbacon的不同点
首先,看了他的博客之后,我找遍了文件夹,也没有找到
/etc/qemu-ifup
/etc/qemu-ifdown
这两个文件,我的做法是把coolbacon的文件下载下来,把这两个文件copy到etc文件夹下,然后chmod 777 
其次,uml-utilies和bridge-utils 这两个库文件是一定要安装的,且都可以用yum install 安装
依次执行下面两条指令即可
yum install bridge-utils
yum install uml_utilities(注:此处是下划线,不是-)
然后依照coolbacon博客修改net.c 
static int launch_script(const char *setup_script, const char *ifname, int fd)
{
    int pid, status;
    char *args[4]; /* bacon modified */ 
    //char *args[3];最新版本,此处和上句重复
execv(path, args)
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*/最新版本此处和bacon添加的也有重复,已被我删除                fprintf(stderr, "error:%d %d %d %s %s/n", 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 script/n",                        setup_script);                return -1;            }        }    return 0;}
保存,退出
重新编译
make
./mini2440/mini2440_start.sh

至此,环境搭建成功。

 

 

 

 

你可能感兴趣的:(Linux Fedora21 下QEMU虚拟MINI2440 的配置与搭建)