關於NAND flash的MTD分區與uboot中分區的理解

來源:互聯網
上載者:User

 

       今天做核心移植,準備添加NAND flash的驅動,做到MTD分區時,想起在一本書上看到的一句話,說的是分區時每個區之間沒有間隙,前一個區的結束位址是後一個區的起始地址。可是當我看我的開發板的教程時,分區如下:

static struct mtd_partition smdk_default_nand_part[] = {

      [0] = {

           .name     = "uboot",

           .offset = 0x00000000,

           .size     = 0x00040000,

      },

      [1] = {

           .name     = "kernel",

           .offset = 0x00200000,

           .size     = 0x00300000,

      },

      [2] = {

           .name     = "yaffs2",

           .offset = 0x00500000,

           .size     = MTDPART_SIZ_FULL

      }

};

很顯然,在uboot和kernel分區中存在間隙,心中產生了疑問,難道MTD分區的時候要有注意的問題?通過各方尋找資料和查閱書籍,找到了原因。不對的地方還請大家指正。

 

        首先說一下Linux下固態存放裝置(NAND flash算其中一種)對系統組件的安排方式,一般為

 

 

引導載入程式

 

引導參數

 

核心

 

根檔案系統

 

也就是說,在NAND flash中,各部分的程式是這樣安排的,但哪一端是高地址是依體繫結構不同而不同的,對於ARM,引導載入程式在最低地址處,因此,無論是uboot的分區還是核心MTD分區,引導載入程式的分區都放在了最低地址處。那麼,兩個分區到底怎麼聯絡起來,而我們又該怎麼設定MTD分區呢?先給出我的開發板uboot的分區資訊:

 

bootargs=noinitrd root=/dev/mtdblock2  init=/linuxrc console=ttySAC0

mtdparts=mtdparts=nandflash0:256k@0(bios),128k(params),128k(toc),512k(eboot),1024k(logo),3m(kernel),-(root)

 

       然後說一下MTD分區,這個分區是核心可以識別的分區,也就是說,核心的操作都是基於MTD分區的;而uboot的分區只是為了方便操作,例如,我想將記憶體中0x30000000地址處的內容寫到NAND flash的位移量為2M的地址處,即uboot分區中kernel的起始位置,一般情況,我們要寫

nand write 0x30000000 0x00200000

但如果有了uboot的分區,我們可以寫

nand write 0x30000000 kernel

 

        說清上面的問題,為了進一步闡述後面的問題,這裡再講一下我對uboot引導過程的理解,當系統啟動後,uboot開始執行,他分兩個階段完成工作,主要是一些初始化,然後,載入核心並傳遞核心參數,之後跳入核心執行,核心完成它的初始化工作,其中包括掛載檔案系統。

 

       現在,我們可以翻回頭看上面程式中的MTD分區了。MTD分區中的uboot分區明顯對應了uboot分區中的bios分區(從0開始,大小為128K),而MTD分區中的kernel和yaffs2分區的起始地址和大小也分別對應uboot分區中的kernel和root分區。而因為我們不需要uboot分區中的其他部分,所以在MTD分區中出現了這一部分空隙。但為什麼這麼安排呢?

 

       回想我們在燒寫程式時候的操作,比如我們選擇燒寫核心鏡像,此時,uboot實際執行了一條語句,類似於

 

#define kernel 0x00200000

memcpy(kernel,0x30000000,SZ_3M)

 

       這裡我們燒寫程式的入口地址是0x30000000,也就是說,uboot的下載模式將我們燒寫到記憶體0x30000000處的資料,搬到了NAND flash的kernel處,儲存了起來,因此,這裡要清楚,我們燒寫程式時,實際是將程式先燒寫到了記憶體當中,然後由記憶體搬運到NAND flash中,如果此時我們的MTD分區與uboot中的分區是一致的,那麼核心將來運行時可以很方便的找到核心程式所在的位置,同樣,對檔案系統的yaffs2分區也是如此,而且,與核心分區相比,檔案系統的分區將顯得更加重要,因為將直接影響到根檔案系統能否掛載,這裡是因為上面提到的一行

 

bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

 

       這裡,uboot指定了根檔案系統的代碼來自於mtdblock2,也就是MTD分區的第三個分區(第一個編號為0),也就是我上面說到的,uboot完成初始化後,載入核心,而核心要完成檔案系統的掛載,他從哪裡找檔案系統?就是這裡!/dev/mtdblock2!

       所以,現在我們看到,MTD分區的原因,而且最關鍵的在這裡,其他分區如果與uboot的分區不一致還情有可原,但如果MTD分區中檔案系統的分區與uboot中的root分區不一致,將會直接導致系統無法啟動!

當然,之前操作的都是物理地址,當核心真正運行起來以後,將開始使用虛擬位址。

同樣的,其他幾個引導參數也應該得到滿足,系統才可能正常運行起來

init=/linuxrc   init進程的位置。

console=ttySAC0  終端對應tty裝置,因此,在引導系統前,串口驅動移植應當完成。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.