日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kernel mtd 分区与UBOOT 分区的理解

發布時間:2023/12/10 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kernel mtd 分区与UBOOT 分区的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天做內核移植,準備添加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設備,因此,在引導系統前,串口驅動移植應當完成

總結

以上是生活随笔為你收集整理的kernel mtd 分区与UBOOT 分区的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。