自从前些天安装配置完毕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两个打包压缩的版本可供下载:
选择任一个下载即可,只是使用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中有关配置文件的模板,还是不行。最后用如下一个精简版的配置文件运行成功,请参考:
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跑起来的界面显示,跟大家分享一下成功的喜悦,哈哈~~
big_endian is false.
arch: arm
cpu info: armv3 , arm7tdmi , 41007700 , fff8ff00 , 0
mach info: name at91 , mach_init addr 0x8062ea0
can't find device module: (name:lcd , type:(null))
uart_mod: 0 , desc_in: , desc_out: , converter:
SKYEYE: use arm7100 mmu ops
Loaded ROM images/romfs.img
exec file " linux-2.4.x/linux " 's format is elf32-little.
load section .init: addr = 0x01000000 size = 0x0000a000.
load section .text: addr = 0x0100a000 size = 0x000e4d00.
load section .data: addr = 0x010f0000 size = 0x0000a6d8.
not load section .bss: addr = 0x010fa6e0 size = 0x00022700 .
not load section .debug_abbrev: addr = 0x00000000 size = 0x0003ec44 .
not load section .debug_info: addr = 0x00000000 size = 0x019d8a71 .
not load section .debug_line: addr = 0x00000000 size = 0x00304781 .
not load section .debug_pubnames: addr = 0x00000000 size = 0x0000c669 .
not load section .debug_aranges: addr = 0x00000000 size = 0x000024d8 .
start addr is set to 0x01000000 by exec file.
Linux 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
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
On node 0 totalpages: 1024
zone( 0 ): 0 pages.
zone( 1 ): 1024 pages.
zone( 2 ): 0 pages.
Kernel command line: root = /dev/rom0
Calibrating delay loop... 15.82 BogoMIPS
Memory: 4MB = 4MB total
Memory: 2900KB available (915K code , 184K data , 40K init)
Dentry cache hash table entries: 512 (order: 0 , 4096 bytes)
Inode cache hash table entries: 512 (order: 0 , 4096 bytes)
Mount cache hash table entries: 512 (order: 0 , 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0 , 4096 bytes)
Page-cache hash table entries: 1024 (order: 0 , 4096 bytes)
POSIX conformance testing by UNIFIX
Linux NET4 .0 for Linux 2.4
Based upon Swansea University Computer Society NET3 .039
Initializing RT netlink socket
Starting kswapd
Atmel USART driver version 0.99
ttyS0 at 0xfffd0000 (irq = 2 ) is a builtin Atmel APB USART
ttyS1 at 0xfffcc000 (irq = 3 ) is a builtin Atmel APB USART
Blkmem copyright 1998 , 1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0 : 1400000 -15183FF [ VIRTUAL 1400000-15183FF ] (RO) <ROMFS>
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
SkyEye NE2k Ethernet driver version 0.2 ( 2003 - 04 - 27 )
sene2k dev name: eth0: < 6 >NET4: Linux TCP/IP 1.0 for NET4 .0
IP Protocols: ICMP , UDP , TCP
IP: routing cache hash table of 512 buckets , 4Kbytes
TCP: Hash tables configured (established 512 bind 512 )
NET4: Unix domain sockets 1.0 /SMP for Linux NET4 .0 .
VFS: Mounted root (romfs filesystem) readonly.
Shell invoked to run file: /etc/rc
Command: hostname GDB-ARMulator
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: mount -t proc proc /proc
mount: /etc/mtab: Read-only file system
Command: mount -t ext2 /dev/ram0 /var
mount: /etc/mtab: Read-only file system
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: mkdir /var/empty
Command: cat /etc/motd
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ | | | | / /
| |_| | |__| || | | | | |_| |/
| _______|_||_|_| |_|____|_/_/
| |
|_|
GDB/ARMulator support by <davidm@snapgear.com>
For further information check:
http://www.uclinux.org/
Command: /bin/ifconfig eth0 up 10.0.0.2
Execution Finished , Exiting
Sash command shell (version 1.1.1 )
/>
下一步我会将介绍在uClinux下加入自己的应用程序的过程。同时这个内核和配置文件如何结合并修改,使之能够仿真S3C44B0X,也是另外一个要解决的问题,且听下回分解吧。