- 论坛徽章:
- 0
|
与Linux2.4内核相比,Linux2.6内核在性能、模块支持、可用性、可测量性等方面有大幅度的提高。Linux2.6内核取代2.4内核是大势所趋。
ARM9
S3C2410
微处理器是一款由SAMSUNG公司为手持终端设计的低价格、低功耗、高性能,基于ARM920T核的微处理器。它与
Linux
的结合越来越紧密,逐渐在嵌入式领域得到广阔的
应用
。目前,在PDA、移动通信、
路由器
、工业控制等领域都可以看到
S3C2410
与Linux相结合的身影。
当前市场上基于
S3C2410
微处理器的开发板绝大部分都是用Nand Flash作为主存储器。Nand Flash是一种可在
系统
上进行电擦写,掉电后信息不丢失的存储器。
开发板从上电到
内核
启动需要一个引导程序,在嵌入式Linux系统下称为Boot loader。
vivi
是韩国MIZI公司为其ARM9系列产品研发的Boot Loader。
MTD
(存储
技术
器件)是Linux内核采纳的一种
设备
子系统,它为底层的存储芯片提供了统一的设备接口。
然而,vivi的Nand Flash分区(简称
vivi分区
)并不适合Linux2.6内核的需求,必须作出修改。而
内核MTD分区
是与
vivi分区
相对应的,随着
vivi分区
的改变也须重新定制。
本文在分析
vivi分区
与
内核MTD分区
的基本概念及两者关系的
基础
上,详细介绍了基于
S3C2410
开发板的Linux2.6内核下的vivi及
内核MTD分区
方法。
Vivi分区和
内核MTD分区
的
解析
Vivi分区解析
Vivi分区指的是给引导程序、内核映像、
文件
系统等在Nand Flash上分配
空间
及起始地址。在vivi的
命令
模式下输入命令:part show,可得
vivi分区
信息。未作修改的
vivi分区
信息如表1。
![]()
从信息中可知,vivi把Nand Flash分为4个区,分别为vivi、param、kernel、root。信息中的offset表示各
分区
在Nand Flash中的起始位置,size及的后面128k、64k、768k、1M+256k表示各分区的大小,flag为标识符。
未修改的vivi给放置内核映像文件zImage的kernel分区只有768k,但2.6内核的映像文件 一般都超过1M。另外,MIZI公司针对其自身产品所设计的vivi只对略大于2M的Nand Flash空间进行了分区;然而,
S3C2410
开发板的Nand Flash容量为一般为32M或64M的,还有很大的空间可用。所以,重新定制
vivi分区
十分必要。
内核MTD分区
解析
Linux2.6内核的MTD能够支持ROM、RAM、FLASH(NOR和NAND)等存储芯片。MTD同时可提供两类MTD驱动程序,一类是MTD设备地址空间的映射,提供直接访问设备的操作;另一类则为建立文件系统提供基础。
在基于Linux2.6内核的
S3C2410
开发板上,Nand Flash上各段存储空间都被定义成MTD分区来
管理
的,各分区都可以通过Linux系统中的设备文件来访问。所以在内核中必须有MTD对引导程序、内核映像、文件系统在Nand Flash上的分区信息。
vivi分区
与
内核MTD分区
的关系
从Nand Flash启动时,
S3C2410
硬件会自动把Nand Flash前4K代码拷贝芯片内部RAM空间,CPU其实是从内部RAM开始执行代码的,所以vivi必须放到Nand Flash顶端。vivi开始执行后将初始化硬件设备、建立内存空间映射表,为调用内核做好准备;然后把压缩的内核映像加载到SDRAM中;最后跳转到内核映像入口,启动内核。
内核MTD分区
必须与
vivi分区
相一致。因为,
vivi分区
中的地址是引导程序、内核映像及文件系统下载到Nand Flash的真正地址;而内核启动时,内核并不是去读
vivi分区
中的地址,而是去读
内核MTD分区
设定的地址;所以,如果
内核MTD分区
与
vivi分区
不相同,很可能导致不能正常启动内核及读取文件系统。
vivi和内核MTD的重新分区
vivi的重新分区
根据开发板的Nand Flash大小及开发用途确定新的
vivi分区
,如表2。
![]()
打开vivi源代码下的arch/s3c2410/smdk.c文件,在函数:“mtd_partition_default_mtd_partitions[]={}”中可以看到vivi默认的Nand Flash分区信息。根据表2的新分区信息,在上述函数中以相同的格式修改原有分区信息即可完成vivi的重新分区。
内核MTD的重新分区
在给内核MTD重新分区之前,有一点应该注意,2.6.16(含)以前内核与2.6.17(含)以后内核的MTD重新分区方法是不一样的,前者是需要增加新的分区信息,而后者源代码初始文件中已含分区信息,需要的是修改分区信息。
Linux2.6.16(含)以前内核的MTD重新分区
首先,在内核源代码arch/arm/mach-s3c2410/devs.c文件下增加头文件:“linux/mtd /partitions.h”、“asm/arch/nand.h”、“linux/mtd/nand.h”。注意,因为头文件之间也有先后关联的关系,所以要把这三句放到#include“devs.h”下面。若放在其他地方,编译可能报错。
然后,同样在devs.c文件下,根据表2添加新的分区信息:
Static struct mtd_partition partition_info[]={
{name:“vivi”,size:0x00020000,offset:0,}
{name:“param”,size:0x00010000,offset:0x00020000,},
{name:“kernel”,size:0x001d0000,offset:0x00030000,},
{name:“root”,size:0x00400000,offset:0x00200000,mask_flags:mtd_writeable,},
{name:“program”,size:0x03a00000,offset:0x00600000,}
};
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,};
最后,在devs.c文件的s3c_device_nand函数中增加:“.dev={.platform_data=& superlpplatform}”;在arch/arm/mach-s3c2410/mach-smdk2410.c文件的“static struct platform_device*smdk2410_
devices[]_initdata={}”中增加“&s3c_device_nand”。目的是使内核在启动时初始化nand flash信息。
Linux2.6.17(含)以后内核的MTD重新分区
Linux2.6.17(含)以后内核的MTD分区要比Linux2.6.16(含)以前内核简单很多,因为源代码的初始文件中已含分区信息,只要修改一下就行了。
在源代码arch/arm/mach-s3c2410/common-smdk.c文件下的函数“mtd_partition smdk_default_nand_part[]={}”中,可以看到默认的MTD分区。根据表1,以相同的格式修改原分区信息即可完成MTD的重新分区。
结语
基于Linux2.6内核的Linux与ARM9
S3C2410
的结合将会在嵌入式领域得到广泛的应用。
vivi分区
与
内核MTD分区
是两者进行联合开发的基础。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104304/showart_2064832.html |
|