2.6.14 内核移植说明文档

来源:互联网 发布:汽车改装杂志 知乎 编辑:程序博客网 时间:2024/05/19 07:43

【转】2.6.14 内核移植说明文档

转自: http://www.cnitblog.com/luofuchong/archive/2007/01/10/21725.html

发现luofuchong的博客,全身都沉浸在快感当中。。。

文章的主体来自luo兄,具体原文,请点击链接,享受正版。

 

一、编译内核

1.make distclean或者make mrproper

如果你是新下载的内核,那这一步就不用了。

但如果你用的是别人移植好的内核,那最好在编译内核之前先清除一下中间文件,因为你们用来编译内核的交叉编译工具可能不同。

2.修改Makefile

主要是以下两项:

1)ARCH = arm

2) CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux-

:在我的宿主机上有不少的交叉编译工具,而我又不习惯每次都传递参数,所以我选择写进Makefile,如果你的交叉编译工具存放在不同的目录或者使用不同的交叉编译工具,那你改变一下CROSS_COMPILE的值就行了。

3.配置内核(Make menuconfig)

我一般会选择load一个配置文件然后在它的基础上修改。方法:选中load an Alternate Configuration File,然后键入配置文件的路径。

在我刚编译内核的时候选择的是linux-2.6.14/arch/arm/configs/smdk2410_defconfig这个配置文件。

4.make

然后一切OK,2.6内核的编译就是这么简单。你可以在linux-2.6.14/arch/arm/boot/目录下看到我们需要的zImage文件。这就是经过压缩的内核镜像文件,把它下载到目标板上的flash中即可运行。由于2410已经作为2.6内核的标准板来支持,所以上面编译的这个内核不用什么修改即可运行,在串口可以看到内核的启动信息。

主要是启动参数的问题:在2.6内核中,2410的串口由原来的ttyS0变为ttySAC0(听说其它的板还是保持不变,具体没有研究)。有关内核启动参数的设置以后会逐步提到。

  

二、让内核支持yaffs文件系统

1.MTD分区的支持

前面介绍了如何编译一个内核,现在要介绍的是如何让内核支持yaffs文件系统。在介绍添加文件系统的支持之前,首先了解一下有关mtd分区的概念:

MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。

好了,其它的就不说了,有兴趣可以上网查一下相关的资料,下面说明让内核支持mtd分区的配置选项:

进入Device Drivers->Memory Technology Devices(MTD)目录,配置界面如下:
Memory Technology Device (MTD) support
[ ]   Debugging                                                          │ │
[ ]   MTD concatenating support                                          │ │
[*]   MTD partitioning support                                           │ │
[ ]     RedBoot partition table parsing                                  │ │
[ ]     Command line partition table parsing                             │ │
[ ]     ARM Firmware Suite partition parsing                             │ │
---   User Modules And Translation Layers                                │ │
[*]   Direct char device access to MTD devices                           │ │
[*]   Caching block device access to MTD devices                         │ │
[ ]   FTL (Flash Translation Layer) support                              │ │
[ ]   NFTL (NAND Flash Translation Layer) support                        │ │
[ ]   INFTL (Inverse NAND Flash Translation Layer) support               │ │
      RAM/ROM/Flash chip drivers  --->                                   │ │
      Mapping drivers for chip access  --->                              │ │
     Self-contained MTD device drivers  --->                            │ │
      NAND Flash Device Drivers  --->                                    │ │

进入NAND Flash Device Drivers目录,配置界面如下:
     [*] NAND Device Support                                              │ │
     [ ]   Verify NAND page writes                                        │ │
     [*] NAND Flash support for S3C2410/S3C2440 SoC                       │ │
     [*]   S3C2410 NAND driver debug                                      │ │
     [ ]   S3C2410 NAND Hardware ECC                                     │ │
     [ ] DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplement│ │
     [ ] Support for NAND Flash Simulator                                │ │

其它不用多设,甚至Direct char device access to MTD devices选项和Mapping drivers for chip access  --->目录下的所有选项都可以去掉(经已试验过)。因为那些是为nor flash服务的,一般文件系统都会放在nand flash上吧,不过也不排除例外。那你就干脆让它们留着好了,因为编译出来后实在多不了多少,我把它们去掉的原因只是为了试验^_^

  

2.文件系统的支持

Yaffs文件系统是专业针对nand flash的文件系统,比jffs2文件系统拥有更高的处理速度,更节省内存,支持的mtd分区更大等众多优点,所以在此选用yaffs文件系统。

Yaffs文件系统内核没有集成,可以对其主页下载:

http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2.tar.gz?view=tar 

建议下载yaffs2源码包,里面就支持了yaffs和yaffs2两种文件系统,把它添加进内核也很方便,有专门的脚本来处理。以下是我在文坛上发过的贴,里面介绍了把yaffs文件系统支持添加进内核的全过程:

一、首先下载内核2.6.14和交叉编译工具3.4.1,详细参考这个文档:
http://www.hfrk.net/S3C2410/kaifa/05122311085973789_56.htm

可以看到其实要修改部分不多,主要是加上nandflash的支持和mtd分区表的填写,如下:
1.修改arch\arm\mach-s3c2410\devs.c文件 //当时内核版本较低,现在基本不需要增加了,这里仅作参考。
增加头文件定义
/***********add here***********/
#include  <linux/mtd/partitions.h>
#include  <asm/arch/nand.h>
#include  <linux/mtd/nand.h>
/**************end add********/ 

增加nand flash分区信息
/***********add here***********/
static struct mtd_partition partition_info[] ={
  {
    name: "loader",
    size: 0x00020000,
    offset: 0,
  }, {
    name: "param",
    size: 0x00010000,
    offset: 0x00020000,
  }, {
    name: "kernel",
    size: 0x001c0000,
    offset: 0x00030000,
  }, {
    name: "root",
    size: 0x00200000,
    offset: 0x00200000,
    mask_flags: MTD_WRITEABLE,
  }, {
    name: "user",
    size: 0x03af8000,
    offset: 0x00400000,
  }
}; 

struct s3c2410_nand_set nandset ={
    nr_partitions: 5 ,
    partitions: partition_info ,
}; 

struct s3c2410_platform_nand superlpplatform={
    tacls:0,
    twrph0:30,
    twrph1:0,
    sets: &nandset,
    nr_sets: 1,
};
/**************end add********/ 

struct platform_device s3c_device_nand = {
    .name  = "s3c2410-nand",
    .id  = -1,
    .num_resources  = ARRAY_SIZE(s3c_nand_resource),
    .resource  = s3c_nand_resource, 

/***********add here****************/
    .dev = {
        .platform_data = &superlpplatform
    }
/**************end here************/
};


2. 修改arch\arm\mach-s3c2410\mach-smdk2410.c文件
static struct platform_device *smdk2410_devices[] __initdata={
    &s3c_device_usb,
    &s3c_device_lcd;
    &s3c_device_wdt,
    &s3c_device_i2c;
    &s3c_device_iis,
    &s3c_device_nand, /*add here*/
}; 

注:分区表信息要参考你自己的内核和文件系统的大小,排布来设置,vivi中的分区信息要和mtd分区信息一致,分多少个区由你自己决定,我的就只分了4个区^_^。

 

二、为了支持yaffs2文件系统,需要帮内核加上对yaffs2文件系统的支持,详细请看这个贴:
http://www.hfrk.net/S3C2410/kaifa/061400335345164_30.htm "您要查找的资源可能已被删除,已更改名称或者暂时不可用。"

主要是把yaffs2文件系统的文件拷贝到fs目录,并修改Makefile 和Kconfig文件。

在配置方面有些地方要注意一下,以下是我的配置信息:

注:mtd分区配置的信息前面已经有了,可以回头参考前面的配置。

File systems->Miscellaneous filesystems目录,配置信息如下:
[*] YAFFS2 file system support                                               │ │
---   512 byte / page devices                                                │ │
[]     Lets Yaffs do its own ECC                                             │ │
[]       Use the same ecc byte order as Steven Hill's nand_ecc.c             │ │
---   2048 byte (or larger) / page devices     //jaffs2                     │ │
[]     Autoselect yaffs2 format                                             │ │
[]     Disable lazy loading                                                 │ │
[]   Turn off wide tnodes                                                   │ │
[]   Turn off debug chunk erase check                                       │ │
[]   Cache short names in RAM 

在这里要说明一下以上的配置,在论坛发贴的时候我因为对它不怎么了解,几乎是全部选上的。后来经过自己的理解和摸索,发现:

1、---   2048 byte (or larger) / page devices  目录以下全部不用选,因为这是yaffs2文件系统的,如果你是用yaffs文件系统的话就不必选择这个了(我到现在还没去研究yaffs2比yaffs文件系统优越多少,反正yaffs文件系统用得好好的) 

2、Lets Yaffs do its own ECC这一项,网上很多人说yaffs文件系统和mtd驱程的更新速度问题,导致加上ecc检测后,会挂不了yaffs文件系统,所以要把mtd驱程的ecc检测去掉,让yaffs自己做ecc检测(就是要选上这一项)。不过去掉mtd驱程ecc检测的后果就是换来烦人的Reading data from NAND FLASH without ECC is not recommended的提示,后来发现原来把mtd驱程的ecc检测加回去,也可以很好的支持yaffs文件系统,所以就把这一项去掉了,终于可以不用再看那烦人的提示了^_^

  

三、现在轮到郁闷我了很久的devfs的问题,因为2.6.12内核以后取消了devfs的配置选项,具体为了什么我不清楚,不过缺少了它内核问题抱怨找不到mtdblock设备。据我所知网上每天都有不少的新手在为此事而困扰^_^ 

以下给出解决方法:

从2.6.12的fs/Kconfig中拷贝下面几项到2.6.14的fs/Kconfig中去:

config DEVFS_FS 
bool "/dev file system support (OBSOLETE)" 
depends on EXPERIMENTAL 
help 
…………………………………………………

config DEVFS_MOUNT 
bool "Automatically mount at boot" 
depends on DEVFS_FS 
help 
………………………………………………….

config DEVFS_DEBUG 
bool "Debug devfs" 
depends on DEVFS_FS 
help 
…………………………………………………..

help的部分就省了,反正你在2.6.12内核的配置文件会看得到,或者自己写上去也行。

重新make menuconfig 在File systems->Pseudo filesystems目录里面可以看到devfs的配置选项如下:
[*] /proc file system support                                          │ │
[*] /dev file system support (OBSOLETE)                                │ │
[*]   Automatically mount at boot                                      │ │
[*]   Debug devfs                                                      │ │
[*] Virtual memory file system support (former shm fs)                 │ │
[ ] Relayfs file system support 

顺便说一下,在内核配置的时候经常会看到debug选项吧?这是为了调度内核用的,你不需要的话可以去掉。有时还会让你选择quiet和nosy,选择nosy的话输出的调试信息当然会比quiet要多了。

  

三、内核的下载和使用(关于文件系统的制作和下载请看相应的贴)

下载内核相当简单,我是直接在vivi下使用load flash kernel u来下载的内核(其实在下载内核和文件系统之前要涉及到vivi中mtd分区的设置问题,不过还是在文件系统的制作和使用部分再说好了)。

文件系统和内核的关系不是很大,所以你可以用你新做好的2.6内核看看能否挂载板上自带的yaffs文件系统,我还没做自己的文件系统之前就是这样做的。如果成功的话,恭喜你迈出了第一步。

顺便介绍一下内核启动参数的设置:

Flash启动:param set linux_cmd_line “noinitrd root=/dev/mtdblock/3 (init=/linuxrc) console=ttySAC0”

Nfs启动:‍   param set linux_cmd_line “console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.115:/friendly-arm/root ip=192.168.1.128:192.168.1.1:192.168.1.1:255.255.255.0:luofuchong:eth0:off”

//  经常用u-boot 可以参看u-boot 的启动参数设置。

四、总结:

幸好以前有发贴的习惯,内容保存得很好。写这份文档主要是根据我以后配置内核的经验对以前的配置作一点修改和提一下要点。如果不明的话恐怕你要自己多配置多查资料了,毕竟内核配置是以后经常要用到的,对内核配置选项的熟悉其重要性就不用多说了。好了,总结如此,希望对你有帮助。