自从前些天安装配置完毕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跑起来的界面显示,跟大家分享一下成功的喜悦,哈哈~~
下一步我会将介绍在uClinux下加入自己的应用程序的过程。同时这个内核和配置文件如何结合并修改,使之能够仿真S3C44B0X,也是另外一个要解决的问题,且听下回分解吧。