Linux-2.6.18移植有了我们的交叉编译环境和我们先前学的内核基础知识,下面我们就开始我们的内核移植了,我们所用的是博创的 S3C2410 。
关于 linux-2.6.18.tar.bz2 的下载网站先前我们说过,我们要先到该官方网站上去下载一个全新的内核。
[root@Binnary ~ ]# tar –jxvf linux-2.6.18.tar.bz2[root@Binnary ~ ]# make mrproper如果你是新下载的内核,那这一步就不用了。
但如果你用的是别人移植好的内核,那最好在编译内核之前先清除一下中间文件,因为你们用来编译内核的交叉编译工具可能不同。
第一步:修改Makefile文件将改为第二步:修改分区设置信息我们要先在BootLoader中查看相应的分区信息vivi>help然后修改内核源码中的分区信息。
分区信息文件在a rch/arm/mach-s3c2410/common-smdk.c将其中的改为如下内容:第三步:内核通过 BootLoader把数据写入NAND Flash,而vivi的ECC效验算法和内核的不同,内核的效验码是由NAND Flash控制器产生的,所以在此必须禁用NAND Flash ECC。
所以我们就要修改 drivers/mtd/nand/s3c2410.c 这个文件。
将中的 chip->ecc.mode = NAND_ECC_SOFT ,改为如下 chip->ecc.mode = NAND_ECC_NONE。
只此一处。
第四步:下面是devfs的问题,因为2.6.12内核以后取消了devfs的配置选项,缺少了它内核会找不到mtdblock设备。
所以我们需要修改 fs/Kconfig 文件,或者是从2.6.12的fs/Kconfig中拷贝下面几项到2.6.18的fs/Kconfig中去,我们采用修改的方法来完成。
修改 fs/Kconfig支持devfs 。
在Pseudo filesystems 主菜单的最后添加我们所要的内容。
第五步:文件系统的支持Yaffs 文件系统YAFFS文件系统简介YAFFS,Yet Another Flash File System,是一种类似于JFFS/JFFS2的专门为Flash设计的嵌入式文件系统。
与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。
YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作。
它们的不同之处在于:(1)、JFFS是一种日志文件系统,通过日志机制保证文件系统的稳定性。
YAFFS仅仅借鉴了日志系统的思想,不提供日志机能,所以稳定性不如JAFFS,但是资源占用少。
(2)、JFFS中使用多级链表管理需要回收的脏块,并且使用系统生成伪随机变量决定要回收的块,通过这种方法能提供较好的写均衡,在YAFFS中是从头到尾对块搜索,所以在垃圾收集上JFFS的速度慢,但是能延长NAND的寿命。
(3)、JFFS支持文件压缩,适合存储容量较小的系统;YAFFS不支持压缩,更适合存储容量大的系统。
YAFFS还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD和VFS,直接对文件进行操作。
NAND Flash大多采用MTD+YAFFS的模式。
MTD( Memory Technology Devices,内存技术设备)是对Flash操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开。
Yaffs 文件系统内核没有集成,可以对其主页下载:/cgi-bin/viewcvs.cgi/#dirlist建议下载 yaffs2 源码包,里面就支持了 yaffs 和 yaffs2 两种文件系统,把它添加进内核也很方便,有专门的脚本来处理。
以下是我在文坛上发过的贴,里面介绍了把 yaffs 文件系统支持添加进内核的全过程:添加对yaffs的支持,打补丁包名为:yaffs2.tar.gz[root@Binnary ~ ]# tar –zxvf yaffs2.tar.gz[root@Binnary ~ ]# cd yaffs2[root@Binnary yaffs2 ]# ./patch–ker.sh /usr/src/linux-2.6.18第六步:MTD 分区的支持到了 MTD 的支持,下面我们看一下存储设备。
所有嵌入式系统的启动都至少需要使用某种形式的永久性存储设备,即使是在引导过程的最初阶段。
大多数系统,包括嵌入式系统,仍会继续使用同一个存储设备来进行它的其余操作(执行程序代码或是存取数据)。
然而,与传统的嵌入式软件相比,在嵌入式系统中使用 Linux 对存储硬件的需求,不论就规模或结构来看都比较大。
下面让我们来看一下 Linux 支持的永久性存储设备。
MTD在 Linux 的术语中,memory technology device(存储技术设备,MTD)涵盖了所有存储设备。
如常见的ROM、RAM、flash 以及 M-Systems 的 DiskOnChip(DOC)。
这类设备的能力、特性和限制,各不相同。
因此,为了在自己的系统中编程和使用 MTD 设备,嵌入式系统开发者传统上会使用该类设备专属的工具和方法。
为了尽可能避免针对不同的技术使用不同的工具,以及为不同的技术提供共同的能力,Linux 内核纳入了 MTD 子系统。
它提供了一致且统一的接口,让底层的 MTD 芯片驱动程序无缝地与称为“用户模块”的较高层接口组合在一起,如下图所示,这些“用户模块”不应该跟内核模块或任何用户空间的软件搞混。
“MTD 用户模块”指的是内核中的软件组件,它们会借着提供可识别的接口和抽象层,让内核的较高层或用户空间能够存取底层MTD芯片驱动程序。
图:MTD 子系统MTD 芯片驱动程序必须向 MTD 子系统注册,方法是通过 mtd_info 结构给add_mtd_device()函数提供一组缺省的回调函数及属性。
MTD 驱动程序必须提供回调函数,让 MTD 子系统能够调用它来执行删除、读出、写入和同步等操作。
以下列出目前已经可以使用的 MTD 芯片驱动程序。
DiskOnChip (DOC)这是 M-Systems 公司DOC技术的驱动程序。
目前,Linux 支持 DOC 1000 、DOC 2000 和DOC Millennium。
Common Flash Interface (CFI)CFI是一个由 Intel、AMD 和其他 flash 制造商共同开发的规格。
所有与CFI兼容的flash 组件都会将它们的配置和参数直接存放在芯片上。
因此,它们的侦测软件接口,配置及使用能够标准化。
内核中内含侦测和支持CFI 芯片的程序代码。
因为CFI规格允许不同的芯片使用不同的命令,所以目前内核的支持包括了两个基本点不同芯片系列(Intel/Sharp和AMD/Fujitsu)所实现的两种指令集。
JEDECJEDC (Solid State Technology Association)是一个为 flash 芯片定义标准的组织,它还负责为此类设备分发识别编号。
尽管CFI的出现使得JEDC flash 标准被淘汰出局,不过目前仍旧存在与 JEDEC 兼容的芯片。
MTD 子系统支持此类设备的侦测和配置设定。
非 DOC 的 NAND flashNAND flash 是 M-systems 公司的DOC设备最普遍的规格。
然而,市场上还有其他类型的 NAND flash 芯片。
MTD 子系统对一些这种设备使用非DOC的驱动程序。
该驱动程序支持设备的完整列表,可参内核源码树中的include/linux/mtd/nand.ids.h文件。
旧式非CFI的flash有些 flash 芯片即不兼容CFI也不兼容JEDEC。
因此,MTD子系统会根据制造商的规格为此类设备提供驱动程序。
这种设备被支持的形式包括:非CFI 但与AMD兼容的 flash 芯片、pre-CFI 的Sharp 芯片,以及非CFI的JEDEC 设备。
然而,不要忘了,此类设备的更新并不如较常用的设备(如DOC或CFI 设备)来得频频。
RAM、ROM和不在系统上的芯片MTD子系统提供存取一段RAM、ROM芯片的驱动程序,并将它映射到系统的物理寻址空间,就像MTD设备一样。
因为此类芯片与系统的连接有些可能会使用插座或其他可让你移除芯片的类似接头,所以MTD子系统还提供一个驱动程序,可于从系统上移出设备时,用来保存MTD设备节点的注册顺序。
非缓存的RAM如果有任何系统RAM是CPU无法缓存的,在系统正常操作期间你可以将此内存当成MTD设备来使用。
当然,当你关掉系统的电源时,存放在这类媒体上的信息将会消失。
用于测试和评估的虚拟设备当你要为目标板上的设备加入或测试MTD的支持时,有时你可能会想要进行与芯片驱动程序无关的用户模块的操作测试。
为此目的,MTD子系统提供了两种可用来模拟实际MTD硬件的MTD驱动程序:其中一个驱动程序模拟MTD 设备的方式是使用系统的虚拟寻址空间提供的内存,另一个驱动程序模拟MTD设备的方式是使用一般的块设备。
因为不同的MTD设备在物理地址上并不会映射到相同的位置,所以MTD子系统需要使用经过裁剪的mapping驱动程序(映射驱动程序是一种特殊的MTD 驱动程序,它的主要任务是给MTD芯片驱动程序提供MTD设备在系统中的物理地址和一组存取这些设备的函数)以便检查及管理系统上的MTD设备。
有些系统和开发板知道MTD设备的配置,因此内核包含了此类系统专属的映射驱动程序,内核还包含了一般驱动程序,可用来存取系统上没有专属映射驱动程序的CFI flash 芯片。
如果系统的存储设备没有适当的映射驱动程序可用,可能需要以既有的映射驱动程序为蓝本自己建立一个新的。
你可以在内核源码树中的 drivers/mtd/maps/目录里找到既有的映射驱动程序。
如果其他的内核设备驱动程序,一个MTD芯片驱动程序可以管理同一种设备的多个实体。
如,系统上有两个与CFI兼容的 AMD flash 芯片,它们可以被 CFI 驱动程序的单一实体当成是两个不同的MTD设备来管理,不过这取决于设备。
为了让MTD设备里的存储空间易于定制。
MTD子系统还允许把存储设备划分成多个分区。
与硬盘分区非常像的是,每个MTD分区可以当成是独立的MTD设备来存取,在同一个设备上的不同分区可以使用完全不同的格式来存储数据。
实际上,存储设备通常会被划分成许多分区,每个分区的用途各不相同。
在我们为系统的存储设备设好MTD芯片驱动程序的配置后,每个MTD设备上的存储空间将可被一个MTD用户模块管理。
用户模块将会对它管理的MTD设备使用某种存储格式,以及提供较高层内核组件能识别的接口和抽象层。