在SkyEye上仿真运行uClinux

时间:2021-08-29 04:45:51
原文http://blog.csdn.net/funeryoung/archive/2007/11/15/1887595.aspx

自从前些天安装配置完毕SkyEye之后,工作就一直没有什么进展,对于ARM核以及嵌入式的uClinux操作系统的仿真毫无头绪,看了网上很多 帖子也不得其门而入,大概过程倒是了解了个差不多,今天终于痛下决心开始动手实践。经过无数次的郁闷,经过纪哥无数次现场指导,系统终于成功运行!

    总结起来,整个过程大致分四步走:安装交叉编译器;编译uClinux内核;编写SkyEye配置文件;运行仿真。

一、安装交叉编译器

    这一步比较简单。

    首先从uClinux网站上下载交叉编译器。如果要仿真的CPU带有MMU,则要下载m68k-elf-tools系列的交叉编译器,现有最新版本是m68k-elf-20030314;如果要仿真的CPU没有MMU,则要下载arm-elf-tools系列的交叉编译器,现有最新版本是arm-elf-20030314

    因为打算仿真基于ARM7TDMI的S3C44B0X是不带MMU的,所以下载了arm-elf-tools-20030314.sh,并保存在用户主目录下。

    进入用户主目录,修改安装文件,为其添加可执行属性,然后执行之:

        chmod a+x arm-elf-tools-20030314.sh

        ./arm-elf-tools-20030314.sh

执行结束后,arm-elf-tools将安装到/usr/local/arm-elf下,路径也会自动设置好。

二、编译uClinux内核

    这个步骤可是历经磨难,折腾了大半天才搞定的。

    首先从uClinux网站上下载uClinux源代码,现有最新版本是2007年1月30日发布的版本,有gzip和bz2两个打包压缩的版本可供下载:

http://www.uclinux.org/uClinux/dist/uClinux-dist-20070130.tar.gz http://www.uclinux.org/uClinux/dist/uClinux-dist-20070130.tar.bz2

    选择任一个下载即可,只是使用tar解压缩时使用的参数不同。下面以下载gzip文件并保存到用户主目录为例介绍。

    解压缩打包压缩文件:

        tar xzvf uClinux-dist-20070130.tar.gz

    则在用户主目录下会生成一个uClinux-dist的目录。进入该目录,执行配置:

      cd uClinux-dist

    在执行下面这个命令之前,如果你要使用上述的不带MMU支持的交叉编译器的话,那么需要将vendors/config/armnommu/config.arch文件中“CROSS_COMPILE”的值由“arm-linux-”改为“arm-elf-”,否则下面的make menuconfig配置完成后会报告找不到arm-linux-gcc导致编译失败。

        make menuconfig

    很多网页中说可以使用make xconfig,但是需要Xwindow支持。这个make menuconfig应该都是可以的,我没实验make config是如何工作的。

    在menuconfig中,主要是选择Vendor为GDB,Product为SkyEye(过去的网页介绍老版本的uClinux都让选择ARMulator);内核版本要选Linux-2.4.x,不要使用默认的2.6.x,因为交叉编译器版本才2.95.3,太低,2.6.x要求交叉编译器版本不低于3.2。其余参数不用动,选择Exit然后确认Save就可以了。make命令会根据刚才所做的参数修改进行一些新文件的生成和编译,顺利的话很快就可以完成。

    我在这个步骤遭遇的困难最大,中间糗事不断,幸好纪哥每次都及时出现,呵呵。现在看主要问题就是两个,一是修改交叉编译器为arm-elf-gcc;二是 选择内核版本为Linux-2.4.x。对了,还有个大问题忘了说!中间我曾经下载了uClinux最新的Patch打补丁,但是编译还是不成功,于是删 除了uClinux-dist重新解包了一个,但是编译还是有问题,后来才发现是没有make clean和make distclean删除上次编译产生的中间文件的问题。

    好了,如果make menuconfig成功,那么接下来执行关联编译,应该就没什么问题啦:

        make dep

    最后就是编译内核了:

        make

    如果在make的过程中系统报错,说有什么fatal-warnings的话,那么需要修改一个配置文件vendors/config/common/config.arch,在行首添加一个“#”把第92行屏蔽掉。

    如果make顺利完成,将在uClinux-dist/images目录中生成两个文件:linux和romfs.img,同时在uClinux- dist/linux-2.4.x目录中生成一个文件:linux。貌似这两个linux文件是一样的,都是uClinux的内核文件, romfs.img则是文件系统的映像文件。这两个文件在接下来写SkyEye配置文件时或者执行SkyEye仿真时要用到。

三、编写SkyEye配置文件

    一开始我使用的是SkyEye Testsuit中自带的Samsung S3C44B0X的配置文件,因为我测试这个仿真包是可以跑起来的。但是把这个配置文件复制到uClinux-dist目录下运行居然跑不起来。改成 SkyEye目录下的README中有关配置文件的模板,还是不行。最后用如下一个精简版的配置文件运行成功,请参考:

cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
lcd: state=on

    除了必要的cpu、mach和mem_bank参数以及lcd之外,其余配置都被我屏蔽掉了。当然今后还要仔细研究配置文件中的各个参数,再去一步步完善了。从mach参数大家可以发现,现在仿真的并不是S3C44B0X

    编辑好上述文件后,以skyeye.conf为文件名保存在uClinux-dist目录下。

四、运行SkyEye仿真uClinux

    进入uClinux-dist目录,运行SkyEye进行仿真:

        cd uClinux-dist

        skyeye -e linux-2.4.x/linux

    需要注意的是我已经在/usr/bin目录中建立了一个skyeye的符号连接,所以上面才不需要输入skyeye的完整路径。另外,由于skyeye.conf就在当前目录下,所以也就不用在skyeye命令中使用-c参数指定了。

        下面是uClinux跑起来的界面显示,跟大家分享一下成功的喜悦,哈哈~~

在SkyEye上仿真运行uClinux$ skyeye -e linux- 2.4 .x/linux
在SkyEye上仿真运行uClinuxbig_endian is false.
在SkyEye上仿真运行uClinuxarch: arm
在SkyEye上仿真运行uClinuxcpu info: armv3
, arm7tdmi , 41007700 , fff8ff00 , 0
在SkyEye上仿真运行uClinuxmach info: name at91
, mach_init addr 0x8062ea0
在SkyEye上仿真运行uClinuxcan't find device module: (name:lcd
, type:(null))
在SkyEye上仿真运行uClinuxuart_mod:
0 , desc_in: , desc_out: , converter:
在SkyEye上仿真运行uClinuxSKYEYE: use arm7100 mmu ops
在SkyEye上仿真运行uClinuxLoaded ROM    images/romfs.img
在SkyEye上仿真运行uClinuxexec file
" linux-2.4.x/linux " 's format is elf32-little.
在SkyEye上仿真运行uClinuxload section .init: addr
= 0x01000000   size = 0x0000a000.
在SkyEye上仿真运行uClinuxload section .text: addr
= 0x0100a000   size = 0x000e4d00.
在SkyEye上仿真运行uClinuxload section .data: addr
= 0x010f0000   size = 0x0000a6d8.
在SkyEye上仿真运行uClinuxnot load section .bss: addr
= 0x010fa6e0   size = 0x00022700 .
在SkyEye上仿真运行uClinuxnot load section .debug_abbrev: addr
= 0x00000000   size = 0x0003ec44 .
在SkyEye上仿真运行uClinuxnot load section .debug_info: addr
= 0x00000000   size = 0x019d8a71 .
在SkyEye上仿真运行uClinuxnot load section .debug_line: addr
= 0x00000000   size = 0x00304781 .
在SkyEye上仿真运行uClinuxnot load section .debug_pubnames: addr
= 0x00000000   size = 0x0000c669 .
在SkyEye上仿真运行uClinuxnot load section .debug_aranges: addr
= 0x00000000   size = 0x000024d8 .
在SkyEye上仿真运行uClinuxstart addr is set to 0x01000000 by exec file.
在SkyEye上仿真运行uClinuxLinux version
2.4.32 -uc0 (user@yxhcs11) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) # 3 2007年 11月 15日 星期四 20 : 26 : 33 CST
在SkyEye上仿真运行uClinuxProcessor: Atmel AT91M40xxx revision
0
在SkyEye上仿真运行uClinuxArchitecture: EB01
在SkyEye上仿真运行uClinuxOn node
0 totalpages: 1024
在SkyEye上仿真运行uClinuxzone(
0 ): 0 pages.
在SkyEye上仿真运行uClinuxzone(
1 ): 1024 pages.
在SkyEye上仿真运行uClinuxzone(
2 ): 0 pages.
在SkyEye上仿真运行uClinuxKernel command line: root
= /dev/rom0
在SkyEye上仿真运行uClinuxCalibrating delay loop...
15.82 BogoMIPS
在SkyEye上仿真运行uClinuxMemory: 4MB
= 4MB total
在SkyEye上仿真运行uClinuxMemory: 2900KB available (915K code
, 184K data , 40K init)
在SkyEye上仿真运行uClinuxDentry cache hash table entries:
512 (order: 0 , 4096 bytes)
在SkyEye上仿真运行uClinuxInode cache hash table entries:
512 (order: 0 , 4096 bytes)
在SkyEye上仿真运行uClinuxMount cache hash table entries:
512 (order: 0 , 4096 bytes)
在SkyEye上仿真运行uClinuxBuffer cache hash table entries:
1024 (order: 0 , 4096 bytes)
在SkyEye上仿真运行uClinuxPage-cache hash table entries:
1024 (order: 0 , 4096 bytes)
在SkyEye上仿真运行uClinuxPOSIX conformance testing by UNIFIX
在SkyEye上仿真运行uClinuxLinux NET4
.0 for Linux 2.4
在SkyEye上仿真运行uClinuxBased upon Swansea University Computer Society NET3
.039
在SkyEye上仿真运行uClinuxInitializing RT netlink socket
在SkyEye上仿真运行uClinuxStarting kswapd
在SkyEye上仿真运行uClinuxAtmel USART driver version
0.99
在SkyEye上仿真运行uClinuxttyS0 at 0xfffd0000 (irq
= 2 ) is a builtin Atmel APB USART
在SkyEye上仿真运行uClinuxttyS1 at 0xfffcc000 (irq
= 3 ) is a builtin Atmel APB USART
在SkyEye上仿真运行uClinuxBlkmem copyright
1998 , 1999 D. Jeff Dionne
在SkyEye上仿真运行uClinuxBlkmem copyright
1998 Kenneth Albanowski
在SkyEye上仿真运行uClinuxBlkmem
1 disk images:
在SkyEye上仿真运行uClinux
0 : 1400000 -15183FF [ VIRTUAL 1400000-15183FF ] (RO) <ROMFS>
在SkyEye上仿真运行uClinuxRAMDISK driver initialized:
16 RAM disks of 4096K size 1024 blocksize
在SkyEye上仿真运行uClinuxSkyEye NE2k Ethernet driver version
0.2 ( 2003 - 04 - 27 )
在SkyEye上仿真运行uClinuxsene2k dev name: eth0: <
6 >NET4: Linux TCP/IP 1.0 for NET4 .0
在SkyEye上仿真运行uClinuxIP Protocols: ICMP
, UDP , TCP
在SkyEye上仿真运行uClinuxIP: routing cache hash table of
512 buckets , 4Kbytes
在SkyEye上仿真运行uClinuxTCP: Hash tables configured (established
512 bind 512 )
在SkyEye上仿真运行uClinuxNET4: Unix domain sockets
1.0 /SMP for Linux NET4 .0 .
在SkyEye上仿真运行uClinuxVFS: Mounted root (romfs filesystem) readonly.
在SkyEye上仿真运行uClinuxShell invoked to run file: /etc/rc
在SkyEye上仿真运行uClinuxCommand: hostname GDB-ARMulator
在SkyEye上仿真运行uClinuxCommand: /bin/expand /etc/ramfs.img /dev/ram0
在SkyEye上仿真运行uClinuxCommand: mount -t proc proc /proc
在SkyEye上仿真运行uClinuxmount: /etc/mtab: Read-only file system
在SkyEye上仿真运行uClinuxCommand: mount -t ext2 /dev/ram0 /var
在SkyEye上仿真运行uClinuxmount: /etc/mtab: Read-only file system
在SkyEye上仿真运行uClinuxCommand: mkdir /var/tmp
在SkyEye上仿真运行uClinuxCommand: mkdir /var/log
在SkyEye上仿真运行uClinuxCommand: mkdir /var/run
在SkyEye上仿真运行uClinuxCommand: mkdir /var/lock
在SkyEye上仿真运行uClinuxCommand: mkdir /var/empty
在SkyEye上仿真运行uClinuxCommand: cat /etc/motd
在SkyEye上仿真运行uClinuxWelcome to
在SkyEye上仿真运行uClinux           ____ _   _
在SkyEye上仿真运行uClinux          /   __| ||_|
在SkyEye上仿真运行uClinux     _    _| |   | | _ ____   _    _   _   _
在SkyEye上仿真运行uClinux    | | | | |   | || |   _ | | | | / /
在SkyEye上仿真运行uClinux    | |_| | |__| || | | | | |_| |/    
在SkyEye上仿真运行uClinux    |   _______|_||_|_| |_|____|_/_/
在SkyEye上仿真运行uClinux    | |
在SkyEye上仿真运行uClinux    |_|
在SkyEye上仿真运行uClinux
在SkyEye上仿真运行uClinuxGDB/ARMulator support by <davidm@snapgear.com>
在SkyEye上仿真运行uClinuxFor further information check:
在SkyEye上仿真运行uClinuxhttp://www.uclinux.org/
在SkyEye上仿真运行uClinux
在SkyEye上仿真运行uClinuxCommand: /bin/ifconfig eth0 up
10.0.0.2
在SkyEye上仿真运行uClinuxExecution Finished
, Exiting
在SkyEye上仿真运行uClinux
在SkyEye上仿真运行uClinuxSash command shell (version
1.1.1 )
在SkyEye上仿真运行uClinux/>
在SkyEye上仿真运行uClinux

    下一步我会将介绍在uClinux下加入自己的应用程序的过程。同时这个内核和配置文件如何结合并修改,使之能够仿真S3C44B0X,也是另外一个要解决的问题,且听下回分解吧。