uClinux在3000平台上的移植
在Linux环境下,本章主要介绍了uClinux在UP-NETARM3000平台的移植过程。包括: ◆ 内核源码的修改、剪裁和编译过程。 ◆ 内核裁剪时的菜单选项的配置方法。 ◆ 内核及根文件系统的烧写过程。
图12-1 UP-NETARM3000嵌入式教学开发平台
该平台是基于S3C44B0X 处理器,可以运行uC/OS-II和uClinux的系统。 它由核心模块和扩展模块组成。 核心模块包括3C44B0x嵌入式芯片、2MB线性引导Flash和8MB SDRAM;
扩展模块包括16MB非线性Flash、二个串口、一个USB口、一个JTAG通用接口、10M以太网口、触摸屏、17键键盘、320×240STN彩色LCD、16M U盘、直流电机模块、步进电机模块、音频模块、CAN总线模块、A/D和D/A模块、LED显示器、IIC接口和FPGA模块。 如图12-1所示。
uClinux在3000上的移植 所谓Linux移植就是把Linux操作系统针对具体的目标平台做必要改写之后,安装到该目标平台使其正确的运行起来。 这个概念目前在嵌入式开发领域讲的比较多。
其基本内容是:获取某一版本的Linux内核源码,根据具体目标平台对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动,打造一款适合于自己目标平台(可以是嵌入式便携设备也可以是其它体系结构的PC机)的新操作系统,对该系统进行针对目标平台的交叉编译,生成一个内核映象文件,最后把该映象文件烧写(安装)到目标平台中。
而通常对Linux源码的改写工作难度较大,它要求不仅对Linux内核结构要非常熟悉,还要求对目标平台的硬件结构要非常熟悉。 同时还要求对相关版本的汇编语言较熟悉,因为与体系结构相关的部分源码往往是用汇编写的,所以这部分工作一般由目标平台提供商来完成。
比如说针对目前嵌入式系统中最流行的ARM平台,它的这部分工作就是由英国ARM公司的工程师完成的,我们所要做的就是从其网站上下载相关版本Linux内核的补丁(Patch)。 把它打到目标平台的Linux内核上,再进行交叉编译就行。其基本过程如下(以Linux2.6.0为例):
到ftp://ftp.arm.linux.org.uk/pub/linux/linux-2.6/ 上下载Linux2.6.0内核及其关于ARM平台的补丁(如:Patch-2.6.0-rmk1.gz)。 给Linux2.6.0打补丁:zcat ../patch-2.6.0-rmk1.gz | patch –p1(前面../表示补丁文件放在内核文件上一层目录)。
交叉编译环境工具链一般包括binutils(含AS汇编器,LD链接器等),arm-gcc,glibc等。 3.准备交叉编译环境。 交叉编译环境工具链一般包括binutils(含AS汇编器,LD链接器等),arm-gcc,glibc等。 交叉编译环境的搭建也是个复杂的过程。我的博客里有一种简单的方法. http://blog.chinaunix.net/u2/86537/article_100671.html
4.修改内核目录下的Makefile文件,主要是以下几行: ① 注释掉ARCH:=$(shell uname –m | sed –e s/i.86/i386/-e s/sun4u/sparc64/ -e s/arm. */arm/ - e s/sa110/arm/)这一行; ② ARCH ?= 改为 ARCH = arm;
③ CROSS_COMPILE ? = 改为 CROSS_COMPILE = 你的交叉编译工具中arm-linux所在目录/arm-linux-。 5.此后就可以进行编译。
关于交叉编译环境 交叉编译环境的建立最重要的就是要有一个交叉编译器。 所谓的交叉编译就是:利用运行在某机器上的编译器编译某个源程序生成在另一台机器上运行的目标代码的过程。 编译器的生成依赖于相应的函数库,而这些函数库又得依靠编译器来编译,所以这里有个“蛋和鸡”的关系。
修改uClinux内核源码 在完成交叉编译环境的建立之后,进入下一阶段,对uClinux内核的移植修改。uClinux的移植是个繁重的工作,其主要主要包含启动代码的修改,内核的链接及装入,参数传递,内核引导几个部分。
其中启动代码以参数形式把DRAM和Flash数量(指定系统中可用页面的数目和文件系统大小)等信息传给内核。 接下来完成设置陷阱、初始化中断、初始化计时器和初始化控制台等一系列操作,并使内核正确启动。
Linux移植过程中内容非常多,涉及的知识量也很大,而且由于平台的不同和内核版本的不同所涉及的内容往往也有很大不同。 以上内容仅参考。 具体操作时还应收集相关平台及内核版本的详细资料,才能展开相应工作。 下面以已经改造好的uClinux,针对UP-NETARM3000平台来讲解内核的裁减。
12.2.4 Linux内核裁减 Linux内核的裁剪与编译看上去是个挺简单的过程,只是对配置菜单的简单选择。但是内核配置菜单本身结构庞大,内容复杂。现在结合内核裁剪过程,了解配置各选项的作用。 Linux内核的编译菜单都是通过Config.in经由不同脚本解释器产生.config。
它包括“make config”、“make menuconfig”和“make xconfig”等版本。 在选择相应的配置时,有三种选择方式: Y--将该功能编译进内核 N--不将该功能编译进内核 M--将该功能编译成可以在需要时动态插入到内核中的模块
(2) prompt for obsolete code/drivers 该项用于对那些已经陈旧的被现有文件替代了的驱动程序和代码的支持,可以不选; 除非你的机器配置比较旧,但那也会有不少问题。 所以该项以基本不用,在新的版本中已被替换。
2.loadable module support 动态加载模块支持选项,其子项有: (1) enable module support 支持模块加载功能,应该选上。 (2) set version information on all module symbols 该项用来支持跨内核版本的模块支持。 一般不选。 (3) kernel module loader 如果你启用这个选项,你可以通过kerneld程序的帮助在需要的时候自动载入或卸载那些可载入式的模块,我们一般会选上。
3.system type 系统类型,主要是CPU类型以及与此相关的内容。 在UP-NETARM300/3000平台上你在该项上看到的是s3c44b0的ARM系列CPU。
4. General setup (1) support hot-plugable devieces 对可热拔插的设备的支持,看情况选择。若要对U盘等USB设备进行控制,建议选上。 (2) Networking support 网络支持,用到网络设备当然要选上。
5. Networking option 网络选项,它主要是关于一些网络协议的选项。 Linux最强大的功能,也就是在于对网络功能的灵活支持。这部分内容相当多,根据具体情况,一般把以下几项选上。
(1) packet socket 包协议支持,可以让你在TCP不能用时找到一个通讯方法。 (2) unix domain socket 对基本UNIX socket的支持。 (3) TCP/IP networking 对TCP/IP协议栈的支持,当然要
6.Networking deveices 网络设备支持。上面选好了网络协议了,现在选的是网络设备,其实主要就是网卡,所以关键是确定自己平台所使用的网卡芯片,该项下的子项也不少。
12. Console drivers support 控制台设备支持. 必选项: (1) VGA text console 一般台式机选该项,支持VGA显示设备。 (2) Support Frame Buffer devices 该项支持Frame Buffer设备。Frame Buffer技术在2.4.X内核被全面采用,它通过开辟一块内存空间模拟显示设备。这样我们可以像操作具体图形设备一样来操作这块内存,直接给它输入数据。 在具体显示设备上输出图形,在嵌入式设备上广泛采用LCD作为显示设备。
这些也往往是设备开发人员给添加的,以UP-NETARM3000为例,你应选上: ① support for frame buffer devices ②S3C44B0X LCD support ③ Advanced low level driver options ④ 8 bpp packet pixels support 该项在UP-NETARM2410平台上改为 320×240 8bit 256 color STN LCD support
14. Memory Technology Device (MTD) support MTD包含flash和RAM等存储设备。MTD在现在的嵌入式设备中应用的相当多,也特别重要。 选中该项可以对MTD进行动态支持。 其下还有好多具体小项,这里按UP-NETARM3000平台做一些解释:
(1) MTD partitioning support 选上该项可支持对MTD的分区操作。 在对嵌入式设备的操作系统移植过程中往往要对MTD进行分区,然后在各分区放置不同的数据,以让系统能被正确引导启动。
(2) Direct char device access to MTD devices 选该项为系统的所有MTD设备提供一个字符设备,通过该字符设备能直接对MTD设备进行读写以及利用ioctl()函数来获取该MTD设备的相关信息。
(3) Caching block device access to MTD devices 有许多flash芯片其擦除的块太大,因此作为块设备使用效率被大打折扣。 选上该项后,它支持利用RAM芯片作为缓存来使用MTD设备,这时对于MTD设备块设备就相当于它的一个用户,通过JFFS文件系统的控制。 它可以模拟成一个小型块设备,具有读、写、擦除和校验等一系列功能。
(4) NAND flash device drivers 子项中有几项是关于MTD设备驱动的,平台选择的是NAND flash,所以选上它。选上后,在其二级子项中还要选上: ① NAND devices support ② verify NAND pages writes 支持页校验。 ③ NAND flash device on ARM board
16. block devices 块设备。 该项下也有好几个子项,主要是关于各种块设备的支持,至少把RAM的支持项选上,如在我们UP-NETARM3000平台上我们要选上: (1) RAM disk support (2) Initial RAM disk(initrd) support
17. File systems 文件系统在Linux中是非常重要的,该项下的子项也非常多。 (1) Quota support 份额分配支持,择该项则系统支持对每个用户使用的磁盘空间进行限制。 (2) Kernel automounter support 在有NFS文件系统的支持下,选择该项使内核可以支持对一些远端文件系统的自动挂栽。 (3) Kernel automounter version 4 support V3版本的升级,它兼容V3。
(4) Reiserfs support ReiserFS这种文件系统以日志方式,不仅把文件名,而且把文件本身保存在一个“平衡树”里,其速度与ETX2差不多,但比传统的文件系统架构更为高效,尤其适合大目录下文件的情况。
(5) ROM file system support 它是一个非常小的只读文件系统,主要用于安装盘及根文件系统。 (7) Second extended fs support 著名的EXT2(二版扩展文件系统),除非你是用DOS模拟器否则得选它。 (8) Ext3 journalling file system support EXT2的日志版,我们通常叫它EXT3。
(9) Journalling Flash file system v2(jffs2) support Flash日志文件系统,目前UP-NETARM3000的uCliux支持该文件系统。 (11) /proc file system support 这是虚拟文件系统,能够提供当前系统的状态信息。 它运行时在内存生成,不占任何硬盘空间,通过CAT命令可以读到其文件的相关信息。
(12) /dev file system support 它是类似于/proc的一个文件系统,也是虚拟的,主要用于支持devfs(设备文件系统)。 把它选上,就可以不依赖于传统的主次设备号的方式来管理设备,而是由devfs自动管理。
18. character devices LINUX支持很多特殊的字符设备,所以该项下的子项也特别多。 (1) virtual terminal 虚拟终端,选上。
(2) support for console on virtual terminal 虚拟终端控制台,也给选上。 (3) non-standard serial port support 非标准串口设备的支持。 如果你的平台上有一些非标准串口设备需要支持,就选上它。
(4) Serial drivers 串口设置,一般选上自己开发平台相关的串口就行。 在UP-NETARM3000上选S3C44B0 serial port support和support for console on S3C44B0 serial port。
内核的编译 1.make clean 在正式编译你的内核之前先把环境给清理干净。 2.make dep 编译相关依赖文件。 (2.6.X以上版本这步已经被整合到make这一步中) 3.make zImage 最终的编译命令。 有时你可以直接用make(2.6.X版本上用)或make bzImage(给PC机编译大内核时使用)。 4.make install 把相关文件拷贝到默认的目录。当然在给嵌入式设备编译时这步可以不要。