1. 程式人生 > >關於NAND flash的MTD分割槽與uboot中分割槽的理解

關於NAND flash的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:

[email protected](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裝置,因此,在引導系統前,串列埠驅動移植應當完成。

 

相關推薦

關於NAND flash的MTD分割槽uboot分割槽理解

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

hive的靜態分割槽動態分割槽

hive中建立分割槽表沒有什麼複雜的分割槽型別(範圍分割槽、列表分割槽、hash分割槽、混合分割槽等)。分割槽列也不是表中的一個實際的欄位,而是一個或者多個偽列。意思是說在表的資料檔案中實際上並不儲存分割槽列的資訊與資料。 下面的語句建立了一個簡單的分割槽表: create table pa

linux系統的磁碟分割槽管理

        計算機中存放資訊的主要的儲存裝置就是硬碟,但是硬碟不能直接使用,必須對硬碟進行分割,分割成的一塊一塊的硬碟區域就是磁碟分割槽。在傳統的磁碟管理中,將一個硬碟分為兩大類分割槽:主分割槽和擴充套件分割槽。主分割槽是能夠

QT的線程事件循環理解(2)

註釋 由於 做什麽 hid post 適用於 tsig call 循環 1. Qt多線程與Qobject的關系   每一個 Qt 應用程序至少有一個事件循環,就是調用了QCoreApplication::exec()的那個事件循環。不過,QThread也可以開啟事件循環

關於pyhton的__xxx__格式的方法變量的理解

imp fault 初始化 **kwargs tor rep style ear dir() python中類似__xx__的方法和變量是python系統內定義的方法和變量,都是具有特殊意義的基礎變量和方法,一般不要擅自使用,除非知道自己在幹什麽。 具體查看python內置

關於verilog綜合的過程,可綜合不可綜合的理解

前言: 1):數位電路設計過程:         一:行為級:分析電路功能、效能以及其他相容性問題,只驗證設計功能,不考慮設計的任何時序資訊;         二:RTL級:暫存器級,只能使用可綜合語句結構進

賦值語句||&&的理解妙用

一、 宣告變數a a = 1 || 100; a = 0 || 100; 1、上述程式碼在JavaScript(弱型別的解釋型語言)中,結果如下: a = 1 || 100;  //1 a = 0 || 100;  //100 2、上述程式碼在C、Java等(強型別編譯型語言)中,結果如下:

Hive的靜態分割槽動態分割槽 應用場景

採用靜態分割槽:根據資料到來的頻率,新資料的到來 採用動態分割槽:進行資料轉換、重新組合,根據已有資料進行動態分割槽   ———————————————————————————— 好程式設計師大資料培訓:Hive的靜態分割槽與動態分割槽 2018-05-03 12:01

Linux學習筆記(4)磁碟分割槽檔案系統命令

    df 檢查檔案系統的磁碟空間佔用情況,引數-a列出全部目錄,引數-h按KB,MB,GB顯示 du   檢車某個目錄或者檔案佔用的磁碟空間,引數-s顯示佔用總空間,引數-sh統計目錄大小 mo

03 -2 numpypandasisnull()、notnull()、dropna()、fillna()處理丟失資料的理解例項

引入三劍客 import numpy as np import pandas as pd from pandas import Series,DataFrame 處理丟失資料 1.有兩種丟失資料: None: Python自帶的資料型別 不能參與到任何計算中

03 -1 pandas DataFrame理解建立、索引、運算的詳解以及例項

DataFrame DataFrame是一個【表格型】的資料結構,可以看做是【由Series組成的字典】(共用同一個索引)。DataFrame由按一定順序排列的多列資料組成。設計初衷是將Series的使用場景從一維拓展到多維。DataFrame既有行索引,也有列索引。 行索引

關於JS原型鏈的prototype_proto_的個人理解詳細總結

轉載自:https://www.cnblogs.com/az96/p/6014621.html 一直認為原型鏈太過複雜,尤其看過某圖後被繞暈了一整子,今天清理硬碟空間(渣電腦),偶然又看到這圖,勾起了點回憶,於是索性複習一下原型鏈相關的內容,表達能力欠缺邏輯混亂別見怪(為了防止新人__(此處指我)__被在此

JS的建構函式原型物件的理解

一:JS中的建構函式 在這裡可以這樣理解建構函式 ,即構造一個物件的函式就叫做建構函式; 1:那麼我們使用建構函式的目的是構造一個物件 ,如何構造一個物件就是我下面要說的: 在JavaScript中,任何合法的函式都可以作為物件的建構函式,這包括系統內建的函式, 也包括自己定義的函式

linux 磁碟分割槽磁碟配額

一.本地儲存裝置的識別 fdisk -l     檢視真實存在的裝置,並列出分割槽資訊 Device 分割槽的裝置檔名稱 boot  是否引導分割槽(* 是) start  分割槽在硬碟中的起始位置 End 

JVM新生代、老年代永久代的理解

新生代、老年代、永久代 一般把java堆分為新生代、老年代,這樣就可以根據各個年代的特點採用最適當的收集演算法。新生代中,每次垃圾收集時都發現大批物件死去,只有少量物件存活,便採用了複製演算法,只需要付出少量存活物件的複製成本就可以完成收集。而老年代中因為物件存活率高、沒有額外空間對它進行

Linux系統硬碟分割槽掛載光碟的掛載(三)—parted分割槽光碟的掛載

引語           本篇緊接上篇操作,主要講使用parted分割槽工具進行分割槽和掛載以及光碟的掛載。前面我們已經進行了硬碟的新增、分割槽、格式化和掛載,這一篇將介紹使用parted來對硬碟

深入理解CPPCbsearch函式的用法

·使用besearch函式的前提(一些廢話) 首先讓我們先亮出二分法的定義: https://baike.baidu.com/item/二分法/1364267 以及二分法實現的方法: https://blog.csdn.net/sufeiboy/article/details/54401257 這些

windows系統分割槽系統引導

MBR分割槽 主引導記錄(MBR,Main Boot Record)是位於磁碟最前邊的一段引導(Loader)程式碼。它負責磁碟作業系統(DOS)對磁碟進行讀寫時分割槽合法性的判別、分割槽引導資訊的定位,它由磁碟作業系統(DOS)在對硬碟進行初始化時產生的。 通常將包含MBR主引導

fdisk磁碟分割槽掛載

1、檢視磁碟分割槽情況。root使用者 fdisk -l 2、開始對空閒磁碟(sdb)進行分割槽操作。 fdisk /dev/sdb 3、按n,開始分割槽操作 4、按p,設定主分割槽 5、起始位置選擇預設,磁碟大小設定,如下: +xxG/K/M 6、進行磁碟的格式

【Linux初學】系統分割槽分割槽格式化

前言:該部落格主要為慕課網上一節課的筆記 系統分割槽之分割槽與格式化 在此感謝老師通俗易懂的講解 前幾天我在鬧電腦時也遇到了關於分割槽的問題:主分割槽與邏輯分割槽的區別,在此篇部落格都記錄了下來。 1.分割槽的概念  首先,什麼是分割槽?分割槽其實就是我們的硬碟需要分成