新聞中心

EEPW首頁(yè) > 設(shè)計(jì)應(yīng)用 > Linux2.6內(nèi)核的vivi分區(qū)及內(nèi)核MTD分區(qū)

Linux2.6內(nèi)核的vivi分區(qū)及內(nèi)核MTD分區(qū)

作者:解放軍理工大學(xué) 通信工程學(xué)院 梁千帆  陳建華 時(shí)間:2008-04-16 來(lái)源: 收藏

  引言

本文引用地址:http://2s4d.com/article/81624.htm

  與Linux2.4內(nèi)核相比,在性能、模塊支持、可用性、可測(cè)量性等方面有大幅度的提高。取代2.4內(nèi)核是大勢(shì)所趨。

  ARM9 微處理器是一款由SAMSUNG公司為手持終端設(shè)計(jì)的低價(jià)格、低功耗、高性能,基于ARM920T核的微處理器。它與Linux的結(jié)合越來(lái)越緊密,逐漸在嵌入式領(lǐng)域得到廣闊的應(yīng)用。目前,在PDA、移動(dòng)通信、路由器、工業(yè)控制等領(lǐng)域都可以看到與Linux相結(jié)合的身影。

  當(dāng)前市場(chǎng)上基于微處理器的開(kāi)發(fā)板絕大部分都是用Nand Flash作為主存儲(chǔ)器。Nand Flash是一種可在系統(tǒng)上進(jìn)行電擦寫(xiě),掉電后信息不丟失的存儲(chǔ)器。

  開(kāi)發(fā)板從上電到內(nèi)核啟動(dòng)需要一個(gè)引導(dǎo)程序,在嵌入式Linux系統(tǒng)下稱為Boot loader。vivi是韓國(guó)MIZI公司為其ARM9系列產(chǎn)品研發(fā)的Boot Loader。

  MTD(存儲(chǔ)技術(shù)器件)是Linux內(nèi)核采納的一種設(shè)備子系統(tǒng),它為底層的存儲(chǔ)芯片提供了統(tǒng)一的設(shè)備接口。

  然而,vivi的Nand Flash分區(qū)(簡(jiǎn)稱)并不適合的需求,必須作出修改。而是與相對(duì)應(yīng)的,隨著的改變也須重新定制。

  本文在分析vivi分區(qū)與的基本概念及兩者關(guān)系的基礎(chǔ)上,詳細(xì)介紹了基于S3C2410開(kāi)發(fā)板的Linux2.6內(nèi)核下的vivi及方法。

  Vivi分區(qū)和內(nèi)核MTD分區(qū)的解析

  Vivi分區(qū)解析

  Vivi分區(qū)指的是給引導(dǎo)程序、內(nèi)核映像、文件系統(tǒng)等在Nand Flash上分配空間及起始地址。在vivi的命令模式下輸入命令:part show,可得vivi分區(qū)信息。未作修改的vivi分區(qū)信息如表1。

  從信息中可知,vivi把Nand Flash分為4個(gè)區(qū),分別為vivi、param、kernel、root。信息中的offset表示各分區(qū)在Nand Flash中的起始位置,size及的后面128k、64k、768k、1M+256k表示各分區(qū)的大小,flag為標(biāo)識(shí)符。

  未修改的vivi給放置內(nèi)核映像文件zImage的kernel分區(qū)只有768k,但2.6內(nèi)核的映像文件 一般都超過(guò)1M。另外,MIZI公司針對(duì)其自身產(chǎn)品所設(shè)計(jì)的vivi只對(duì)略大于2M的Nand Flash空間進(jìn)行了分區(qū);然而,S3C2410開(kāi)發(fā)板的Nand Flash容量為一般為32M或64M的,還有很大的空間可用。所以,重新定制vivi分區(qū)十分必要。

  內(nèi)核MTD分區(qū)解析

  Linux2.6內(nèi)核的MTD能夠支持ROM、RAM、FLASH(NOR和NAND)等存儲(chǔ)芯片。MTD同時(shí)可提供兩類(lèi)MTD驅(qū)動(dòng)程序,一類(lèi)是MTD設(shè)備地址空間的映射,提供直接訪問(wèn)設(shè)備的操作;另一類(lèi)則為建立文件系統(tǒng)提供基礎(chǔ)。

  在基于Linux2.6內(nèi)核的S3C2410開(kāi)發(fā)板上,Nand Flash上各段存儲(chǔ)空間都被定義成MTD分區(qū)來(lái)管理的,各分區(qū)都可以通過(guò)Linux系統(tǒng)中的設(shè)備文件來(lái)訪問(wèn)。所以在內(nèi)核中必須有MTD對(duì)引導(dǎo)程序、內(nèi)核映像、文件系統(tǒng)在Nand Flash上的分區(qū)信息。

  vivi分區(qū)與內(nèi)核MTD分區(qū)的關(guān)系

  從Nand Flash啟動(dòng)時(shí),S3C2410硬件會(huì)自動(dòng)把Nand Flash前4K代碼拷貝芯片內(nèi)部RAM空間,CPU其實(shí)是從內(nèi)部RAM開(kāi)始執(zhí)行代碼的,所以vivi必須放到Nand Flash頂端。vivi開(kāi)始執(zhí)行后將初始化硬件設(shè)備、建立內(nèi)存空間映射表,為調(diào)用內(nèi)核做好準(zhǔn)備;然后把壓縮的內(nèi)核映像加載到SDRAM中;最后跳轉(zhuǎn)到內(nèi)核映像入口,啟動(dòng)內(nèi)核。

  內(nèi)核MTD分區(qū)必須與vivi分區(qū)相一致。因?yàn)椋瑅ivi分區(qū)中的地址是引導(dǎo)程序、內(nèi)核映像及文件系統(tǒng)下載到Nand Flash的真正地址;而內(nèi)核啟動(dòng)時(shí),內(nèi)核并不是去讀vivi分區(qū)中的地址,而是去讀內(nèi)核MTD分區(qū)設(shè)定的地址;所以,如果內(nèi)核MTD分區(qū)與vivi分區(qū)不相同,很可能導(dǎo)致不能正常啟動(dòng)內(nèi)核及讀取文件系統(tǒng)。

  vivi和內(nèi)核MTD的重新分區(qū)

  vivi的重新分區(qū)

  根據(jù)開(kāi)發(fā)板的Nand Flash大小及開(kāi)發(fā)用途確定新的vivi分區(qū),如表2。

  打開(kāi)vivi源代碼下的arch/s3c2410/smdk.c文件,在函數(shù):“mtd_partition_default_mtd_partitions[]={}”中可以看到vivi默認(rèn)的Nand Flash分區(qū)信息。根據(jù)表2的新分區(qū)信息,在上述函數(shù)中以相同的格式修改原有分區(qū)信息即可完成vivi的重新分區(qū)。

  內(nèi)核MTD的重新分區(qū)

  在給內(nèi)核MTD重新分區(qū)之前,有一點(diǎn)應(yīng)該注意,2.6.16(含)以前內(nèi)核與2.6.17(含)以后內(nèi)核的MTD重新分區(qū)方法是不一樣的,前者是需要增加新的分區(qū)信息,而后者源代碼初始文件中已含分區(qū)信息,需要的是修改分區(qū)信息。

  Linux2.6.16(含)以前內(nèi)核的MTD重新分區(qū)

  首先,在內(nèi)核源代碼arch/arm/mach-s3c2410/devs.c文件下增加頭文件:“linux/mtd/partitions.h”、“asm/arch/nand.h”、“linux/mtd/nand.h”。注意,因?yàn)轭^文件之間也有先后關(guān)聯(lián)的關(guān)系,所以要把這三句放到#include“devs.h”下面。若放在其他地方,編譯可能報(bào)錯(cuò)。

  然后,同樣在devs.c文件下,根據(jù)表2添加新的分區(qū)信息:

  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,}
 ?。?br />   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函數(shù)中增加:“.dev={.platform_data=&superlpplatform}”;在arch/arm/mach-s3c2410/mach-smdk2410.c文件的“static struct platform_device*smdk2410_
devices[]_initdata={}”中增加“&s3c_device_nand”。目的是使內(nèi)核在啟動(dòng)時(shí)初始化nand flash信息。

  Linux2.6.17(含)以后內(nèi)核的MTD重新分區(qū)

  Linux2.6.17(含)以后內(nèi)核的MTD分區(qū)要比Linux2.6.16(含)以前內(nèi)核簡(jiǎn)單很多,因?yàn)樵创a的初始文件中已含分區(qū)信息,只要修改一下就行了。

  在源代碼arch/arm/mach-s3c2410/common-smdk.c文件下的函數(shù)“mtd_partition smdk_default_nand_part[]={}”中,可以看到默認(rèn)的MTD分區(qū)。根據(jù)表1,以相同的格式修改原分區(qū)信息即可完成MTD的重新分區(qū)。

  結(jié)語(yǔ)

  基于Linux2.6內(nèi)核的Linux與ARM9 S3C2410的結(jié)合將會(huì)在嵌入式領(lǐng)域得到廣泛的應(yīng)用。vivi分區(qū)與內(nèi)核MTD分區(qū)是兩者進(jìn)行聯(lián)合開(kāi)發(fā)的基礎(chǔ)。

  參考文獻(xiàn):

  1、 嵌入式Linux系統(tǒng)開(kāi)發(fā)技術(shù)詳解—基于ARM,孫紀(jì)坤、張小全,人民郵電出版社,2006

  2、 ARM9嵌入式技術(shù)及Linux高級(jí)實(shí)踐教程,陳賾,北京航空航天大學(xué)出版社,2005

  3、 中國(guó)Linux公社論壇,《Linux2.6.10以后版本對(duì)S3C2410的支持》

  4、 Mizi公司網(wǎng)站http://www.mizi.com/developer/s3c2410

  5、 Linux MTD網(wǎng)站http://www.linux-mtd.infradead.org



評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉