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設備,因此,在引導系統前,串口驅動移植應當完成

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253245.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

運放的主要參數詳細介紹

1. 引言 運放的作用是調節和放大模擬信號,它是用途十分廣泛的器件,接入適當的反饋網絡,可用作精密的交流和直流放大器、有源濾波器濾波器、振蕩器振蕩器及電壓比較器。其應用領域包括但不限制通訊、電子、汽車、工業檢測等等,并將…

FastDFS 文件上傳工具類

FastDFS文件上傳工具類 import org.csource.common.NameValuePair;import org.csource.fastdfs.ClientGlobal;import org.csource.fastdfs.StorageClient1;import org.csource.fastdfs.StorageServer;import org.csource.fastdfs.TrackerClient;import org.csource.fastdfs.Tra…

MOS管的主要參數與重要特性

雙極性晶體管:NPN和PNP管; 單極性晶體管:場效應管(MOSFET和JFET); MOS管相對三極管具有速度快、輸入阻抗高、噪聲低、動態范圍大、功耗小、容易集成等優點。 下面總結下其主要參數與重要特性&#xff0c…

【Codeforces Round #430 (Div. 2) B】Gleb And Pizza

【鏈接】點擊打開鏈接 【題意】 在這里寫題意【題解】 根據圓心到原點的距離這個東西判斷一下圓在不在那個環里面就好【錯的次數】 0【反思】 在這了寫反思【代碼】 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #…

垂直居中方法總結

<style>#box{position: absolute;margin: auto;top:0px;right: 0px;bottom: 0px;left: 0px;width: 100%;height: 30%;background-color: red;text-align: center;} </style> <body><div id"box"><h1>文字居中</h1></div> …

NAND 壞塊管理

NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH為例&#xff0c;一片Nand flash為一個設備(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 數據塊大小(512Bytes) OOB 塊大小(16Bytes&…

js備忘錄模式——實現分頁點擊已經請求過上一頁的數據(讀js設計模式)

例子&#xff1a;新聞數據實現分頁||點擊下一頁后又點擊上一頁后不用再次請求數據&#xff0c;避免資源浪費&#xff0c;網速不好&#xff0c;用戶體驗效果差 備忘錄模式&#xff1a;在不破壞對象的封裝性的前提下&#xff0c;在對象之外捕獲并保存該對象內部的狀態以方便日后對…

運放的典型電路舉例與計算仿真

運放電路的計算&#xff0c;通過記各種公式很難記住&#xff0c;但是掌握其兩個重要概念&#xff0c;所有計算均可迎刃而解。 那就是運放的兩個重要特性&#xff1a; 虛斷&#xff1a;運放本質特性&#xff0c;輸入阻抗大&#xff0c;兩個輸入端視為等效開路&#xff1b; 虛…

【SPOJ 694】Distinct Substrings (更直接的求法)

【鏈接】h在這里寫鏈接 【題意】 接上一篇文章【題解】 一個字符串所有不同的子串的個數∑(len-sa[i]-height[i])【錯的次數】 0【反思】 在這了寫反思【代碼】 #include<bits/stdc.h> using namespace std;const int N 2e3; const int MAX_CHAR 300;//每個數字的最大…

HTML-錨點

<!DOCTYPE html> <html> <head lang"en"> <meta charset"UTF-8"> <title>錨點</title> <style> .box1,.box2{ height: 600px; border:1px solid; } </style> </head> <body> <a h…

/dev/mtdN和/dev/mtdblockN的區別

1、/dev/mtdn是linux中的MTD架構中&#xff0c;系統自己實現的mtd分區所對應的字符設備&#xff0c;其里面添加了一些ioctl&#xff0c;支持很多命令&#xff0c;如MEMGETINFO&#xff0c;MEMERASE等。 而mtd-util中的flash_eraseall等工具&#xff0c;就是以這些ioctl為基礎而…

#define GPBCON (*(volatile unsigned *)0x56000010) 的理解

2019獨角獸企業重金招聘Python工程師標準>>> 對于不同的計算機體系結構&#xff0c;設備可能是端口映射&#xff0c;也可能是內存映射的。如果系統結構支持獨立的IO地址空間&#xff0c;并且是端口映射&#xff0c;就必須使用匯編語言完成實際對設備的控制&#xff…

三極管基本參數介紹與放大電路分析

全稱為半導體三極管&#xff0c;也稱雙極型晶體管、晶體三極管&#xff0c;是一種電流控制電流的半導器件&#xff0c;作用是把微弱信號放大成幅度值較大的電信號&#xff0c; 也用作無觸點開關。 兩個PN結的排列方式有兩種&#xff1a;PNP和NPN。 三個端點依序稱為射極&#…

Nand分區及nand erase簡解

我的nand flash 32M&#xff0c;kernel 2.6.18, rootfs is emb linux, cramfs.nand flash分區如下&#xff1a;static struct mtd_partition nand_partitions[] {/* bootloader (UBL, U-Boot, BBT) in sectors: 0 - 14 */{.name "bootloader",.offset 0,.size 32…

eclipse啟動了tomcat,但是瀏覽器打不開歡迎頁

tomcat在eclipse中啟動成功&#xff0c;主頁卻打不開 癥狀&#xff1a; tomcat在eclipse里面能正常啟動&#xff0c;而在瀏覽器中訪問http://localhost:8080/不能訪問&#xff0c;且報404錯誤。同時其他項目頁面也不能訪問。 關閉eclipse里面的tomcat&#xff0c;在tomcat安裝目…

洛谷1011 車站

水題。題目描述有坑&#xff0c;可以先根據樣例手算試一試//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int maxn50; int f[50],…

三極管放大電路三種類型

根據三極管三個電極與輸入輸出端子的連接方式&#xff0c;可歸納為三種&#xff1a;共發射極電路、共基極電路和共集電極電路&#xff1b; 三種電路的共同點&#xff1a;各有兩個回路&#xff0c;一個輸入回路一個輸出回路&#xff0c;兩個回路有一個公共 端&#xff0c;而公…

ImportError: No module named 'chardet'

1.使用requsets出現這個錯誤&#xff0c;ImportError: No module named chardet 原因&#xff1a;requests依賴其他一些模塊 解決&#xff1a;依次使用pip安裝即可 pip install certifi pip install chardet pip install idna pip install urllib3轉載于:https://www.cnblogs.c…

各種組件的js 獲取值 / js動態賦值

jQuery獲取Select選擇的Text和Value:語法解釋&#xff1a;1. $("#select_id").change(function(){//code...}); //為Select添加事件&#xff0c;當選擇其中一項時觸發2. var checkText$("#select_id").find("option:selected").text(); //獲取…

Linux下/proc目錄簡介

1. /proc目錄 Linux 內核提供了一種通過 /proc 文件系統&#xff0c;在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個偽文件系統&#xff0c;它只存在內存當中&#xff0c;而不占用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供接口。 用戶…