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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第1章-确定superboot210如何为smart210的nand flash进行的分区划分

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第1章-确定superboot210如何为smart210的nand flash进行的分区划分 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

標(biāo)題的意思簡(jiǎn)單的而說(shuō),其實(shí)就是搞清楚superboot210將boot.bin, kernel和根文件系統(tǒng)分別下載到了什么地方。

首先看一下內(nèi)核的啟動(dòng)信息? (superboot210.bin + linux3.0.8),其中有這么一段:

[??????????? ] S3C NAND Driver is using hardware ECC.
[??????????? ] NAND device: Manufacturer ID: 0xec, Chip ID: 0xdc (Samsung NAND 512MiB 3,3V 8-bit)
[??????????? ] Creating 5 MTD partitions on "s5pv210-nand":

[??????????? ] 0x0000000c0000-0x000000100000 : "misc"
[??????????? ] 0x000000100000-0x000000600000 : "recovery"
[??????????? ] 0x000000600000-0x000000b00000 : "kernel"
[??????????? ] 0x000000b00000-0x000000e00000 : "ramdisk"
[??????????? ] 0x000000e00000-0x000020000000 : "system"

這是在內(nèi)核當(dāng)中的分區(qū)信息,通常情況下,對(duì)于一個(gè)追求完美的程序員來(lái)說(shuō),最好將內(nèi)核的分區(qū)信息和uboot當(dāng)中的分區(qū)信息設(shè)置一致,畢竟看起來(lái)更舒服一些。但是實(shí)際上來(lái)說(shuō),只要內(nèi)核的根文件系統(tǒng)的分區(qū)和uboot的對(duì)應(yīng)的下載根文件的地址一致即可。這是由啟動(dòng)參數(shù)(又叫環(huán)境變量)bootargs決定的,開發(fā)板提供的這個(gè)參數(shù)值為:

bootargs=root=/dev/mtdblock4 rootfstype=yaffs2 console=ttySAC0,115200 init=/linuxrc androidboot.console=ttySAC0 skipcali=yes ctp=2

可以看出,根文件系統(tǒng)被放在了mtdblock4的分區(qū)上,也就是第4+1個(gè)分區(qū),即上面的system分區(qū)。

所以從上面的啟動(dòng)信息來(lái)看,最后一項(xiàng)system分區(qū)肯定是正確的,但是以上四個(gè)是正確的嗎?在我看來(lái),至少第一個(gè)分區(qū)就錯(cuò)了,"misc"分區(qū)肯定是用來(lái)存放boot.bin,這是由ARM啟動(dòng)過(guò)程BL0決定的,但是boot.bin一定要放在0x00的位置,上面的啟動(dòng)信息居然是從c0000開始的,這是開哪門子國(guó)際玩笑。只有一種解釋,這個(gè)分區(qū)信息和uboot真正的分區(qū)信息并不完全對(duì)應(yīng)。

?????? 那么"kernel"分區(qū)是否對(duì)應(yīng)呢?我們知道,uboot想要引導(dǎo)內(nèi)核,首先就要從nand flash中將內(nèi)核讀入到SDRAM里,如果我們連kernel存放在nand flash的哪個(gè)位置都不知道的話,那根本就沒(méi)有必要去嘗試引導(dǎo)了。

????? 首先在uboot的命令行模式下輸入:

? ? ? nand read 0x20000000 0x600000 0x10000

? ?? 然后便出現(xiàn)了網(wǎng)上流傳很廣的那個(gè)錯(cuò)誤:

? ? ?NAND read from offset 600000 failed -74
? ? ? 0 bytes read: ERROR
???? 這說(shuō)明,在0x600000那個(gè)位置里,我們沒(méi)有讀出數(shù)據(jù)來(lái)。其實(shí)數(shù)據(jù)已經(jīng)讀出來(lái)了,不信可以用md 0x20000000看一下。發(fā)生這樣的錯(cuò)誤原因應(yīng)該是我自己的uboot使用的ecc機(jī)制和superboot210使用的ecc機(jī)制不一致造成的。本來(lái)我就是想看看kernel在不在0x600000那里,卻又引出來(lái)一個(gè)ecc的問(wèn)題,挺鬧心的。干脆ecc我先放一放,等先確定好內(nèi)核位置后再著重搞定ecc。但是話又說(shuō)回來(lái)了,這個(gè)錯(cuò)誤反而給我提供了思路來(lái)追終kernel的真正位置。

? ? ? 接下來(lái)我先在uboot中執(zhí)行nand flash擦出工作。

????? nand srcub.chip

???? 完全擦除nand后,uboot就可以隨意正確讀取nand flash上的任何位置的數(shù)據(jù)了。當(dāng)然讀出來(lái)的數(shù)肯定都是ff ff ff ff ,類似與下面的樣子

[ZBL210]# nand read 0x20000000 0x200000 0x800

NAND read: device 0 offset 0x200000, size 0x800
?2048 bytes read: OK
[ZBL210]# md 0x20000000
20000000: ffffffff ffffffff ffffffff ffffffff??? ................
20000010: ffffffff ffffffff ffffffff ffffffff??? ................
20000020: ffffffff ffffffff ffffffff ffffffff??? ................
20000030: ffffffff ffffffff ffffffff ffffffff??? ................
20000040: ffffffff ffffffff ffffffff ffffffff??? ................
20000050: ffffffff ffffffff ffffffff ffffffff??? ................
20000060: ffffffff ffffffff ffffffff ffffffff??? ................
20000070: ffffffff ffffffff ffffffff ffffffff??? ................
20000080: ffffffff ffffffff ffffffff ffffffff??? ................
20000090: ffffffff ffffffff ffffffff ffffffff??? ................
200000a0: ffffffff ffffffff ffffffff ffffffff??? ................
200000b0: ffffffff ffffffff ffffffff ffffffff??? ................
200000c0: ffffffff ffffffff ffffffff ffffffff??? ................
200000d0: ffffffff ffffffff ffffffff ffffffff??? ................
200000e0: ffffffff ffffffff ffffffff ffffffff??? ................
200000f0: ffffffff ffffffff ffffffff ffffffff??? ................

而當(dāng)我將kernel下載到nand flash當(dāng)中后,假如我讀到了kernel的數(shù)據(jù),這時(shí)候就會(huì)顯示錯(cuò)誤,就是用這種笨方法,我終于確定了superboot210將kernel實(shí)際下載到了0x40000~0x900000的位置。

接下來(lái)確定一下uboot將環(huán)境變量下載到哪了呢。這個(gè)可以直接從uboot源碼中找到這樣一個(gè)宏定義

#define CONFIG_ENV_OFFSET?????????????? 0x100000
這個(gè)宏定義就是說(shuō),當(dāng)我們?cè)趗boot中使用save命令的話,它會(huì)將程序當(dāng)中的環(huán)境變量保存到nand flash的0x100000的位置上。

所以現(xiàn)在基本上可以確定分區(qū)了

0~1M?? bootloader

1M~4M?? parameters

4M~9M? kernel

9M~14M? ramdisk

14M~???? rootfs


接下來(lái),重點(diǎn)解決uboot讀取內(nèi)核的ecc問(wèn)題。


總結(jié)

以上是生活随笔為你收集整理的第1章-确定superboot210如何为smart210的nand flash进行的分区划分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。