• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
主题 : 《使用qemu 建立mini2440的模拟仿真环境》补充修正说明 复制链接 | 浏览器收藏 | 打印
星星之火,可以燎原
级别: 骑士
UID: 42844
精华: 2
发帖: 140
金钱: 805 两
威望: 161 点
贡献值: 2 点
综合积分: 320 分
注册时间: 2011-04-11
最后登录: 2016-05-23
楼主  发表于: 2011-10-26 15:45

 《使用qemu 建立mini2440的模拟仿真环境》补充修正说明

我的编译平台是 ubuntu 11.10

按照 http://www.cnblogs.com/jinmu190/archive/2011/03/21/1990698.html

使用qemu 建立mini2440的模拟仿真环境

》的方法,就会遇到以下这些错误:



一、当使用以下

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

语句编译qemu时,出现如下错误


The error log from compiling the libSDL test is:
/tmp/qemu-conf--3170-.c:1:17: fatal error: SDL.h: 没有那个文件或目录
compilation terminated.
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.


那么就可以使用以下语句修复:
sudo apt-get install libsdl-dev
再使用  make -j4 时, 即可编译成功。


二、编译uboot的时候,大家可以将设置初始IP的代码修改为自己想要的IP,比如和自己主机IP一个网段,以方便以后的实验。还有
,一定要记住要记将编译好的 u-boot.bin 拷贝到 qemu/mini2440 的文件夹中去, 否则以后执行mini2440/mini2440_start.sh就会遇到一下错误:
复制代码
  1. QEMU mini2440_reset: loaded default u-boot from NANDQEMU 
  2. mini2440_reset: loaded mini2440/uImage (size 1f7000)
  3. qemu: fatal: Trying to execute code outside RAM or ROM at 0x34000000
  4. R00=00000000 R01=00000000 R02=00000000 R03=00000000R04=00000000 R05=00000000 R06=00000000 R07=00000000R08=00000000 R09=00000000 R10=00000000 R11=00000000R12=00000000 R13=00000000 R14=00000000 R15=34000000PSR=400001d3 -Z-- A svc32
  5. Aborted


三、 当编译kernel时,会出现如下问题:
(我补充下:下载 linux kernel for mini2440的地址为:
http://repo.or.cz/w/linux-2.6/mini2440.git/snapshot/HEAD.tar.gz )


"mkimage" command not found - 

U-Boot images will not be built

这时,执行以下语句即可:
sudo apt-get install uboot-mkimage  (其实这个好像还是有些不太正确的,但是不知为什么后面的u-boot还是可以引导内核的)


其实下面的方法才是真正比较合适的:

如果使用make uImage 则能生成由uboot 引导的内核文件, 需要用到

uboot/tools/mkimage,可以在/etc/bashrc 文件末加入一下语句:

export PATH=$PATH:$PWD/../uboot_src/tools

这样就能直接引用mkimage 命令。

或者直接将uboot_src/tools内的mkimage 拷贝到 /usr/bin/ 内也行。但要记住这个mkimage 是对应于此处的u-boot的。

再重新运行以下语句:
make -j4 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
就OK了!



三、当执行以下语句的时候:(一定要使用root根用户来执行以下语句)
sh mini2440/mini2440_start.sh
又会碰到如下问题:

Starting in mini2440
mini2440/mini2440_start.sh : creating empty snapshot image : mini2440/mini2440_snapshots.img
qemu-img: Invalid image size You may use k, M, G or T suffixes for
qemu-img: kilobytes, megabytes, gigabytes and terabytes.
mini2440/../arm-softmmu/qemu-system-arm -M mini2440 -drive file=mini2440/mini2440_snapshots.img,snapshot=on -serial stdio -kernel mini2440/uImage -mtdblock mini2440/mini2440_nand.bin -show-cursor -usb -usbdevice keyboard -usbdevice mouse -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 -monitor telnet::5555,server,nowait
warning: could not configure /dev/net/tun: no virtual network emulation
Could not initialize device 'tap'

真是困难重重啊,我上网搜索到这篇文章:《解决: 运行qemu 提示"warning: could not open /dev/net/tun: no virtual network emulation"》
http://blog.csdn.net/swangbucknell/article/details/5423187
看起来,有些眉目了,后来,我在按照上面的方法编译内核模块时,又碰到以下问题:
make[2]: *** 没有规则可以创建“kernel/bounds.s”需要的目标“kernel/bounds.c”。 停止。
此时,我大为气馁,后来又在不懈的努力下,发现了问题的所在,原来是/lib/modules/`uname -r`/build 这个文件夹(也就是/usr/src/linux-headers-‘uname -r’-generic-pae/)下面的内核代码不完整,需要重新上网下载该版本的内核源码包,解压后,再进行编译才可以真正的解决这个问题。命令如下:
sudo apt-get install linux-source
再进入到 linux-source-'your version' 之中重新执行下述命令,例如我的版本如下:

make menuconfig 详情请看
《qemu两种上网方式》http://www.linuxdiyf.com/viewarticle.php?id=40202

cd /usr/src/linux-source-2.6.38/
tar xjvf linux-source-2.6.38.tar.bz2
cd linux-source-2.6.38
sudo -s
make && sudo make modules_install
modprobe tun
lsmod |grep tun

其实还有一种方法不需要使用modules_install,也是
《qemu两种上网方式》这篇文章里面的.
要注意三点: 
1.内核源码必须与当前内核版本完全一致,否则编译出的模块是不能用的。 

2.注意只make modules(编译模块),没有make modules_install(自动安装模块到/lib/modules下) 

3.加载新编译的模块前必须先运行depmod,否则modprobe找不到它 

有了tun这个文件后,那么就进入下一个的问题了。


四、开启NFS服务器,就按照开头那篇文章里面所说的进行操作就可以了,当重启NFS的命令的时候,在最新的ubuntu11.10中就会出现以下语句:

exportfs: /etc/exports [3]: Neither 'subtree_check' or 'no_subtree_check' specified for export "*:/opt/FriendlyARM/mini2440/root_qtopia".  

Assuming default behaviour ('no_subtree_check').

  NOTE: this default has changed since nfs-utils version 1.0.x

其实不用紧张,这对于后面使用NFS挂载文件系统没有关系,但大家注意了,这里在/etc/exports中,大家要就不要使用友善的rootfs_qtopia_qt4这个文件系统了,因为现在使用的qemu这个模拟器中只支持64M的NAND(或者也有可能是大家从开头那篇文章里面编译的u-boot是属于64M的版本,这里还得做后续研究)。所以推荐大家使用老版的root_qtopia文件系统,否则就会出现qemu挂载失败的结果。


五、对于mini2440_start.sh这个文件,其实大家只需要修改下面这个地方就可以了:
-net nic,vlan=0 \
    -net tap,vlan=0,ifname=tap0 \
修改为:
 -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=./qemu-ifup,downscript=./qemu-ifdown \



六、当遇到下面的问题时, 
复制代码
  1. ./qemu-ifup: could not launch network scriptCould not initialize device 'tap'


使用下面命令即可:chmod a+x qemu-ifup qemu-ifdown

对于qemu-ifup, qemu-ifdown 这两个文件,大家可以按照自己的情况,将其中10.0.0.1 这个IP换成和自己主机一个IP网段的地址即可,不一定非要是那个IP,而且开头文章里面的u-boot的IP地址是10.0.0.4 ,其实可以在编译uboot的时候,找到设置初始IP的代码换成自己想要的IP即可。


七、当按照开头文章之中的步骤跑起来qemu中的mini2440后,会发现出现以下错误,一直挂载不了NFS文件系统:

VFS: Mounted root (nfs filesystem) on device 0:13.
Freeing init memory: 132K
nfs: server 10.66.3.4 not responding, still trying

这个问题,一方面一定要把

u-boot启动成功后输入设置linux kernel的引导参数
set bootargs noinitrd root=/dev/nfs rw nfsroot=10.0.0.1:/home/lizhao/ARM-pro/nfs/rootfs ip=10.0.0.10:10.0.0.1::255.255.255.0 console=ttySAC0,115200

这个u-boot引导参数之中的 nfsroot=.... 里面的内容修改成自己机器上面的NFS环境。


另一方面,我发现开头文章中最后给出的解决方法(如下)只能说是个提示,并没有起作用:


友善之臂提供的qtopia文件系统在挂载时会初始化网卡,但我们是由nfs挂载的文件系统,这会导致nfs连接中断,挂载失败,所以用nfs挂载之前需要把网卡的初始化过程取消,对应的文件是/etc/init.d/if-config,只需把该文件内容清空即可。Enjoy yourself!

而是应该把 root_qtopia 文件系统中的 etc/init.d/rcS 这个文件中的如下两个语句注释掉即可:
#/sbin/ifconfig lo 127.0.0.1
#/etc/init.d/ifconfig-eth0
在完成上面的修改后,大家就可以真正的享受qemu-mini2440带给我们的开发和调试乐趣了!

插入几个做实验的图,引诱一下大伙:
  
  
  
  


楼下还有相关分析和解释,请大家接着往下看!
[ 此帖被cyx8648在2012-06-05 11:45重新编辑 ]
星星之火,可以燎原!
星星之火,可以燎原
级别: 骑士
UID: 42844
精华: 2
发帖: 140
金钱: 805 两
威望: 161 点
贡献值: 2 点
综合积分: 320 分
注册时间: 2011-04-11
最后登录: 2016-05-23
1楼  发表于: 2011-10-26 15:59
大家注意了,上面qemu只能模拟64M和128M的mini2440, 如果需要使用256M及以上容量的
大页模式的(在2048byte/page)
NAND flash,那么就需要修改qemu的代码使之支持型号为 K9F2G08,大小为 256M的NAND flash。




(旧版本为 K9F1208,大小为 64Mbyte 的
小页(512byte/page)的nand flash
 ,其实这128M也是
大页模式的(2K/page)的NAND FLASH
)




由于本人精力和能力有限,希望各位有兴趣的高手大侠,有时间的话,研究下,如何使上文中的qemu支持大容量如256M的NAND flash ,这样,也可在暂时没有开发板的情况下来,继续学习和实验了!
[ 此帖被cyx8648在2012-03-29 17:24重新编辑 ]
星星之火,可以燎原!
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2011-10-26 17:22
谢谢分享。
我当初用过这个qemu-mini2440 + 虚拟的SD卡镜像, 只要你硬盘空间够,想要多大就有多大:)
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
星星之火,可以燎原
级别: 骑士
UID: 42844
精华: 2
发帖: 140
金钱: 805 两
威望: 161 点
贡献值: 2 点
综合积分: 320 分
注册时间: 2011-04-11
最后登录: 2016-05-23
3楼  发表于: 2011-10-26 21:16

 回 2楼(kasim) 的帖子

好的,原来如此,谢谢您的建议,我会再仔细研究一下虚拟SD卡的使用!
星星之火,可以燎原!
级别: 新手上路
UID: 59815
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2011-11-30
最后登录: 2011-12-30
4楼  发表于: 2011-11-30 18:36

 回 楼主(cyx8648) 的帖子

顶下楼主
星星之火,可以燎原
级别: 骑士
UID: 42844
精华: 2
发帖: 140
金钱: 805 两
威望: 161 点
贡献值: 2 点
综合积分: 320 分
注册时间: 2011-04-11
最后登录: 2016-05-23
5楼  发表于: 2012-03-17 14:33
这篇帖子http://www.aiothome.net/read.php?tid=17331  也说了在安装qemu过程中的一些问题
[ 此帖被cyx8648在2012-03-20 10:16重新编辑 ]
星星之火,可以燎原!
星星之火,可以燎原
级别: 骑士
UID: 42844
精华: 2
发帖: 140
金钱: 805 两
威望: 161 点
贡献值: 2 点
综合积分: 320 分
注册时间: 2011-04-11
最后登录: 2016-05-23
6楼  发表于: 2012-03-22 21:42
关于" qemu-mini2440 + 虚拟的SD卡镜像 " 的网址有以下这些:

http://code.google.com/p/mini2440/wiki/QEmuSDCardImage  这个里面有个重要的步骤被忽略了,就是在建立 disk/boot 后,一定要把 uImage 拷贝进去,否则之后就没法启动了

http://project4fun.com/node/33
第二个网页的内容是一个泰国人写的,可以使用谷歌浏览器将它翻译为英文,就可以很好的理解了。

还有我的以前在mini2440实体开发板上面做的SD卡实验:http://www.aiothome.net/read.php?tid-15866.html
后来,我又结合这个实验把 qemu上面的SD卡挂载文件系统,成功实现了。但是过程中也遇到一些问题:
复制代码
  1. sudo: /usr/sbin/brctl: command not found
  2. mini2440_init: Boot mode: NANDS3C: CLK=240 HCLK=240 PCLK=240 UCLK=57
  3. QEMU: ee24c08_initDM9000: INIT QEMU MAC : 52:54:00:12:34:56
  4. QEMU mini2440_reset: loaded default u-boot from NAND
  5. QEMU mini2440_reset: loaded override u-boot (size 3b800)
  6. Floating point exception


对于这个问题,很简单, 由于我的主机使用的是ubuntu,使用命令 whereis brctl  后发现 brctl 是在 /sbin/brctl 这里, 所以只需要将 http://project4fun.com/node/33 中提到的 qemu-ifup 中的 brctl 修改为正确的地址,然后再重新 执行 network.sh 和 start.sh , 就可以正常运行了。
[ 此帖被cyx8648在2012-03-24 16:22重新编辑 ]
星星之火,可以燎原!
星星之火,可以燎原
级别: 骑士
UID: 42844
精华: 2
发帖: 140
金钱: 805 两
威望: 161 点
贡献值: 2 点
综合积分: 320 分
注册时间: 2011-04-11
最后登录: 2016-05-23
7楼  发表于: 2012-03-29 17:52

 回 1楼(cyx8648) 的帖子

最近,又研究了一下qemu-uboot-kernel这套代码,发现了只需要修改两个地方就可以使qemu支持256M以及以上容量的NAND FLASH,

一、

# vim qemu_src/hw/mini2440.c

找到下面这第372行代码:

    /* Check the boot mode */
    switch (mini->boot_mode) {
        case BOOT_NAND:
            sram_base = S3C_SRAM_BASE_NANDBOOT;
            int size = bdrv_getlength(drives_table[nand_idx].bdrv);
            switch (size) {
                case 2 * 65536 * (512 + 16):
                    nand_cid = 0x76;
                    break;
                case 4 * 65536 * (512 + 16):
                    nand_cid = 0xf1;
                    break;
                default:
                    printf("%s: Unknown NAND size/id %d (%dMB) defaulting to old 64MB\n",
                            __func__, size, ((size / (512 + 16)) * 512) / 1024 / 1024);
                    break;
            }
            break;

在default: 语句上方加入下面这三行:

        case 8 * 65536 * (512 + 16):
                    nand_cid = 0xda;                       // 256MB flash == 0xda
                    break;

如果要支持比如 512M 容量的 NAND FLASH , 那么可以模仿上面的代码,跟着加入下面三行:

        case 16 * 65536 * (512 + 16):
                    nand_cid = 0xdc;                       // 512MB flash == 0xdc
                    break;

至于里面为什么是 512 +16 ,可以看看这个网页:http://bbs.eeworld.com.cn/thread-305322-1-1.html

至于 0xda 是什么东西,可以看看 qemu_src/nand.c 中下面这些内容:
/* Information based on Linux drivers/mtd/nand/nand_ids.c */
static const struct {
    int size;
    int width;
    int page_shift;
    int erase_shift;
    uint32_t options;
} nand_flash_ids[0x100] = {
................................
    [0x76] = { 64, 8, 9, 5, 0 },
................................
  /*
     * These are the new chips with large page size. The pagesize and the
     * erasesize is determined from the extended id bytes
     */
# define LP_OPTIONS    (NAND_SAMSUNG_LP | NAND_NO_READRDY | NAND_NO_AUTOINCR)
# define LP_OPTIONS16    (LP_OPTIONS | NAND_BUSWIDTH_16)
......................................................................
  /* 1 Gigabit */        [0xa1] = { 128, 8, 0, 0, LP_OPTIONS },        [0xf1] = { 128, 8, 0, 0, LP_OPTIONS },       [0xb1] = { 128, 16, 0, 0, LP_OPTIONS16 },       [0xc1] = { 128, 16, 0, 0, LP_OPTIONS16 },
    /* 2 Gigabit */
    [0xaa] = { 256,    8,    0, 0, LP_OPTIONS },
    [0xda] = { 256,    8,    0, 0, LP_OPTIONS },
................................................................

二、
还要修改一个文件,那就是 

vim qemu_src/mini2440/mini2440_start.sh 

修改为以下内容:
echo Starting in $base
#name_nand="$base/mini2440_nand64.bin"
#name_nand="$base/mini2440_nand128.bin"
name_nand="$base/mini2440_nand256.bin"
if [ ! -f "$name_nand" ];then
 echo $0 : creating NAND empty image : "$name_nand"
# dd if=/dev/zero of="$name_nand" bs=528 count=131072
# dd if=/dev/zero of="$name_nand" bs=2112 count=65536 
dd if=/dev/zero of="$name_nand" bs=135168 count=2048

..........................................................
至于为什么bs 和 count 要取那些值,可以看看这个 http://blog.163.com/chenfang7977@yeah/blog/static/128274196201008101048689/

三、修改完上述两个文件,然后,再重新把 qemu 编译一遍,就可以使用命令  sudo sh mini2440/mini2440_start.sh  来重新启动 qemu-uboot-mini2440了
[ 此帖被cyx8648在2012-03-29 19:38重新编辑 ]
星星之火,可以燎原!
级别: 新手上路
UID: 2836
精华: 0
发帖: 23
金钱: 120 两
威望: 32 点
贡献值: 0 点
综合积分: 46 分
注册时间: 2008-12-12
最后登录: 2018-11-09
8楼  发表于: 2012-04-11 09:33
mark~

感谢楼主分享心得·~·
居然可以模拟了,威武啊·
星星之火,可以燎原
级别: 骑士
UID: 42844
精华: 2
发帖: 140
金钱: 805 两
威望: 161 点
贡献值: 2 点
综合积分: 320 分
注册时间: 2011-04-11
最后登录: 2016-05-23
9楼  发表于: 2012-05-14 09:26
Starting in E-menu
E-menu/../arm-softmmu/qemu-system-arm -M mini2440 -kernel E-menu/uImage -serial stdio -mtdblock E-menu/mini2440_nand64.bin -show-cursor -usb -usbdevice keyboard -usbdevice mouse -net nic,vlan=0 -net tap,vlan=0,ifname=tap1,script=E-menu/qemu-ifup,downscript=E-menu/qemu-ifdown -monitor telnet::5555,server,nowait
Excuting qemu-ifup
mini2440_init: Boot mode: NAND
S3C: CLK=240 HCLK=240 PCLK=240 UCLK=57
QEMU: ee24c08_init
DM9000: INIT QEMU MAC : 52:54:00:12:34:56
QEMU mini2440_reset: loaded default u-boot from NAND
QEMU mini2440_reset: loaded override u-boot (size 3b800)
QEMU mini2440_reset: loaded E-menu/uImage (size 1c8400)
Floating point exception


 哈哈哈!!!我终于解决这个问题啦!我在
http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/5.8_Technical_Notes/kvm.html
这里面看到一段话:



During the boot process inside the qemu-kvm utility, the screen was resized to the height of 1. A mouse click at this point caused a division by zero (the SIGFPE signal was sent) when calculating the absolute position of the pointer from the pixel. As a consequence, qemu-kvm terminated with the "Floating point exception" error. With this update, mouse click coordinates are forced to return values from the middle of the screen, so that qemu-kvm no longer terminates in the described scenario.



它的意思是说,终端命令行的屏幕太小了,需要把它放大一些,才可以用,所以当我把终端放大到全屏的时候,这个问题瞬间就被解决了,大家可以好好的试一试,反正我这边利用这种方法,暂时是没有问题的!
[ 此帖被cyx8648在2012-06-05 11:40重新编辑 ]
星星之火,可以燎原!
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go