随笔-118  评论-133  文章-4  trackbacks-0

2.6.14 内核移植说明文档

一、编译内核

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文件
Startic 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                                  
│ │
[]     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.12fs/Kconfig中拷贝下面几项到2.6.14fs/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”

 

四、总结:

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

 

posted on 2007-01-10 15:35 lfc 阅读(19267) 评论(17)  编辑 收藏 引用

评论:
# re: 2.6.14内核移植心得 2007-01-22 13:58 | 空空
相当不错,感谢分享。  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-02-02 17:56 | sad
6666  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-02-02 17:56 | sad
sdfasdf  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-02-13 12:01 | jarodwang
博主,你好!
我从Handhelds.org的FTP上下载了arm-linux-gcc-3.4.1.tar.bz2作为交叉编译器,因为看到有网友用这个成功编译了2.6.14,所以也想自己试一下.
内核配置(想先使用smdk2410的默认配置试一下能否成功编译):
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
加载了arch/arm/configs/smdk2410_defconfig
保存以后make,结果报错两个:

include/linux/jiffies.h:27:5: warning: "CONFIG_HZ" is not defined

include/linux/kmalloc_sizes.h:5:5: warning: "CONFIG_X86_L1_CACHE_SHIFT" is not defined

然后编译过程就中止了,请问这个问题应该如何解决?这个交叉编译器版本和2.6.14究竟是否匹配?

还有我的主机端开发环境是CentOS 4.4
[root@localhost ~]# uname -a
Linux localhost 2.6.9-42.EL #1 Sat Aug 12 09:17:58 CDT 2006 i686 athlon i386 GNU/Linux  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-07-21 11:24 | 张伟
请问你的自带的 yaffs 文件系统可以发给我一份吗?
fengh123456@163.com
现在内核一直挂不上文件系统,所以想用你的试一下;
多谢!  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-07-21 14:51 | 刚刚起步
very good  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-07-21 14:51 | 刚刚起步
不错  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-07-26 08:47 | 方正
楼主你好,很感谢你的经验分享。我有三个问题:
(1)我现在内核启动可以没问题,但是串口输出信息出现——
Warning: unable to open an initial console.
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
请您分析一下是不是挂接文件系统出错?还是内核启动参数设置错误?

(2)还有一个问题,按照您说的方法在内核中加入了文件系统yaffs的支持以后是不是make生成的内核镜像zImage中就包含了文件系统(这个问题好像挺傻)?
还是只是生成的内核支持yaffs文件系统?而具体的文件系统镜像需要进一步自己制作?

(3)如果问题二的结论是修改过的2.6.14版本的内核(加入了nand flash分区和yaffs支持和devfs支持)只是支持yaffs而不是含有了yaffs的话,自己制作好的文件系统是应当通过loadyaffs root x下载到root分区中吗?  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-07-29 09:59 | dg322
相当不错,
你是在锐极开发板上实现的吧!  回复  更多评论
  
# re: 2.6.14内核移植心得 2007-12-13 17:06 | xxj
我按照你上面移植2.6.14的内核,结果出现下面的错误,能帮我看下吗?谢谢!
Copy linux kernel from 0x00050000 to 0x30008000, size = 0x00200000 ... done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySA
C0"
MACH_TYPE = 782
NOW, Booting Linux......
Uncompressing Linux.............................................................
..... done, booting the kernel.

Error: unrecognized/unsupported machine ID (r1 = 0x0000030e).

Available machine support:

ID (hex) NAME
0000016a SMDK2440

Please check your kernel config and/or bootloader.  回复  更多评论
  
# re: 2.6.14内核移植心得[未登录] 2007-12-22 00:59 | conan
just so so
你用的是友善的板子吗?
"我是直接在 vivi 下使用 load flash kernel u 来下载的内核"
公版的mizi的vivi 没有 "u"的
除非是超高手自己编写了vivi中支持usb下载.
  回复  更多评论
  
# re: 2.6.14内核移植心得 2008-07-23 15:32 | 你好!感谢您分享您的移植心得
我按照你的方法成功移植了2.6.14内核到S3C2410开发板上
现在遇到的问题是我的文件系统不好用,请问您有制作好的适用于2.6内核的文件系统可以发给我吗,谢谢!
我的联系方式:apple54ai@sohu.com  回复  更多评论
  
# re: 2.6.14内核移植心得 2008-11-17 16:32 | william_djj
我的整个根文件系统都是yaffs,没有再分为root和usr,能把您的真个根文件系统做成yaffs发给我么,我邮箱是william_djj@126.com
谢谢。

我的yaffs文件系统原来可以启动linux2.4.18,但换成linux2.6.14.1,kernel启动后就是下面的错误。
...

yaffs: dev is 32505858 name is "mtdblock2"

yaffs: Attempting MTD mount on 31.2, "mtdblock2"

block 190 is bad

block 346 is bad

block 347 is bad

block 348 is bad

block 349 is bad

block 350 is bad

block 351 is bad

block 352 is bad

block 354 is bad

block 355 is bad

block 360 is bad

block 361 is bad

block 364 is bad

block 365 is bad

**>>yaffs ecc error fix performed on chunk 11690:0

**>>yaffs ecc error unfixed on chunk 11690:1

**>>Block 365 marked for retirement

**>>yaffs ecc error fix performed on chunk 11706:0

**>>yaffs ecc error fix performed on chunk 11706:1

**>>Block 365 marked for retirement

**>>yaffs ecc error unfixed on chunk 11721:0

**>>yaffs ecc error unfixed on chunk 11721:1

...  回复  更多评论
  
# re: 2.6.14内核移植心得 2008-12-07 15:22 | ansspend
博主你好,最近我也在做Linux arm kernel 一值在做失敗,是否能請你寄給我你在ARM上可WORK的.config檔嗎?
e-mail:ansspend@hotmail.com  回复  更多评论
  
# re: 2.6.14内核移植心得 2008-12-09 22:13 | helight.xu
你好不知你的邮箱是多少,想请教一些spi移植的问题我的邮箱是
helight.xu @ gmail.com  回复  更多评论
  
# What a joy to find such clear thinking. Tnhaks for posting! 2011-05-23 06:02 | Jacoby
What a joy to find such clear thinking. Tnhaks for posting!  回复  更多评论
  
只有注册用户登录后才能发表评论。