第1章-确定superboot210如何为smart210的nand flash进行的分区划分
標(biāo)題的意思簡單的而說,其實就是搞清楚superboot210將boot.bin, kernel和根文件系統(tǒng)分別下載到了什么地方。
首先看一下內(nèi)核的啟動信息? (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ū)信息,通常情況下,對于一個追求完美的程序員來說,最好將內(nèi)核的分區(qū)信息和uboot當(dāng)中的分區(qū)信息設(shè)置一致,畢竟看起來更舒服一些。但是實際上來說,只要內(nèi)核的根文件系統(tǒng)的分區(qū)和uboot的對應(yīng)的下載根文件的地址一致即可。這是由啟動參數(shù)(又叫環(huán)境變量)bootargs決定的,開發(fā)板提供的這個參數(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個分區(qū),即上面的system分區(qū)。
所以從上面的啟動信息來看,最后一項system分區(qū)肯定是正確的,但是以上四個是正確的嗎?在我看來,至少第一個分區(qū)就錯了,"misc"分區(qū)肯定是用來存放boot.bin,這是由ARM啟動過程BL0決定的,但是boot.bin一定要放在0x00的位置,上面的啟動信息居然是從c0000開始的,這是開哪門子國際玩笑。只有一種解釋,這個分區(qū)信息和uboot真正的分區(qū)信息并不完全對應(yīng)。
?????? 那么"kernel"分區(qū)是否對應(yīng)呢?我們知道,uboot想要引導(dǎo)內(nèi)核,首先就要從nand flash中將內(nèi)核讀入到SDRAM里,如果我們連kernel存放在nand flash的哪個位置都不知道的話,那根本就沒有必要去嘗試引導(dǎo)了。
????? 首先在uboot的命令行模式下輸入:
? ? ? nand read 0x20000000 0x600000 0x10000
? ?? 然后便出現(xiàn)了網(wǎng)上流傳很廣的那個錯誤:
? ? ?NAND read from offset 600000 failed -74
? ? ? 0 bytes read: ERROR
???? 這說明,在0x600000那個位置里,我們沒有讀出數(shù)據(jù)來。其實數(shù)據(jù)已經(jīng)讀出來了,不信可以用md 0x20000000看一下。發(fā)生這樣的錯誤原因應(yīng)該是我自己的uboot使用的ecc機制和superboot210使用的ecc機制不一致造成的。本來我就是想看看kernel在不在0x600000那里,卻又引出來一個ecc的問題,挺鬧心的。干脆ecc我先放一放,等先確定好內(nèi)核位置后再著重搞定ecc。但是話又說回來了,這個錯誤反而給我提供了思路來追終kernel的真正位置。
? ? ? 接下來我先在uboot中執(zhí)行nand flash擦出工作。
????? nand srcub.chip
???? 完全擦除nand后,uboot就可以隨意正確讀取nand flash上的任何位置的數(shù)據(jù)了。當(dāng)然讀出來的數(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ù),這時候就會顯示錯誤,就是用這種笨方法,我終于確定了superboot210將kernel實際下載到了0x40000~0x900000的位置。
接下來確定一下uboot將環(huán)境變量下載到哪了呢。這個可以直接從uboot源碼中找到這樣一個宏定義
#define CONFIG_ENV_OFFSET?????????????? 0x100000
這個宏定義就是說,當(dāng)我們在uboot中使用save命令的話,它會將程序當(dāng)中的環(huán)境變量保存到nand flash的0x100000的位置上。
所以現(xiàn)在基本上可以確定分區(qū)了
0~1M?? bootloader
1M~4M?? parameters
4M~9M? kernel
9M~14M? ramdisk
14M~???? rootfs
接下來,重點解決uboot讀取內(nèi)核的ecc問題。
總結(jié)
以上是生活随笔為你收集整理的第1章-确定superboot210如何为smart210的nand flash进行的分区划分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笨办法学linux dhcp,了解网关、
- 下一篇: Flutter仿写一个iOS风格的通讯录