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
至此,环境搭建成功。