• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 設計應用 > Linux2.6內核的vivi分區及內核MTD分區

    Linux2.6內核的vivi分區及內核MTD分區

    作者:解放軍理工大學 通信工程學院 梁千帆  陳建華 時間:2008-04-16 來源: 收藏

      引言

    本文引用地址:http://www.czjhyjcfj.com/article/81624.htm

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

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

      當前市場上基于微處理器的開發板絕大部分都是用Nand Flash作為主存儲器。Nand Flash是一種可在系統上進行電擦寫,掉電后信息不丟失的存儲器。

      開發板從上電到內核啟動需要一個引導程序,在嵌入式Linux系統下稱為Boot loader。vivi是韓國MIZI公司為其ARM9系列產品研發的Boot Loader。

      MTD(存儲技術器件)是Linux內核采納的一種設備子系統,它為底層的存儲芯片提供了統一的設備接口。

      然而,vivi的Nand Flash分區(簡稱)并不適合的需求,必須作出修改。而是與相對應的,隨著的改變也須重新定制。

      本文在分析vivi分區與的基本概念及兩者關系的基礎上,詳細介紹了基于S3C2410開發板的Linux2.6內核下的vivi及方法。

      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分區是兩者進行聯合開發的基礎。

      參考文獻:

      1、 嵌入式Linux系統開發技術詳解—基于ARM,孫紀坤、張小全,人民郵電出版社,2006

      2、 ARM9嵌入式技術及Linux高級實踐教程,陳賾,北京航空航天大學出版社,2005

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

      4、 Mizi公司網站http://www.mizi.com/developer/s3c2410

      5、 Linux MTD網站http://www.linux-mtd.infradead.org



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 台南县| 雅江县| 宜黄县| 张北县| 张家港市| 宁阳县| 阿拉善盟| 鹿邑县| 九寨沟县| 郯城县| 连云港市| 永城市| 威海市| 安义县| 吉林市| 盐源县| 淅川县| 肃南| 平乐县| 天津市| 田东县| 山阳县| 江华| 滦平县| 平罗县| 台北市| 会东县| 永和县| 麟游县| 凌云县| 皋兰县| 偃师市| 长汀县| 日土县| 吉林省| 从江县| 留坝县| 安顺市| 留坝县| 蓝田县| 广平县|