分區(qū)只是內(nèi)核的概念,就是說A~B地址放內(nèi)核,C~D地址放文件系統(tǒng),(也就是規(guī)定哪個地址區(qū)間放內(nèi)核或者文件系統(tǒng))等等。
1:在內(nèi)核MTD中可以定義分區(qū)A~B,C~D。。。。。。并予以絕對的地址賦值給每個分區(qū)。我們可以來看看在內(nèi)核中是怎樣來對MTD進行分區(qū)的:arch\arm\plat-s3c24xx\common-smdk.c
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot",
.size = SZ_16K,
.offset = 0,
},
[1] = {
.name = "S3C2410 flash partition 1",
.offset = 0,
.size = SZ_2M,
},
[2] = {
.name = "S3C2410 flash partition 2",
.offset = SZ_4M,
.size = SZ_4M,
},
[3] = {
.name = "S3C2410 flash partition 3",
.offset = SZ_8M,
.size = SZ_2M,
},
[4] = {
.name = "S3C2410 flash partition 4",
.offset = SZ_1M * 10,
.size = SZ_4M,
},
......
};
一般我們只需要分3-4個區(qū),第一個為boot區(qū),一個為boot參數(shù)區(qū)(傳遞給內(nèi)核的參數(shù)),一個為內(nèi)核區(qū),一個為文件系統(tǒng)區(qū)。
而對于bootloader中只要能將內(nèi)核下載到A~B區(qū)的A地址開始處就可以,C~D區(qū)的C起始地址下載文件系統(tǒng)。。。這些起始地址在MTD的分區(qū)信息中能找到。所以bootloader對分區(qū)的概念不重要,只要它能把內(nèi)核燒到A位置,把文件系統(tǒng)燒到C位置。
所以,在bootloader對Flash進行操作時,哪塊區(qū)域放什么是以內(nèi)核為主。
而為了方便操作,bootloader類似也引入分區(qū)的概念,如,可以使用“nand write 0x3000000 kernel 200000”命令將uImage燒到kernel分區(qū),而不必寫那么長:nand write 3000000 A 200000,也就是用分區(qū)名來代替具體的地址。
這要對bootloader對內(nèi)核重新分區(qū):這需要重新設置一下bootloader環(huán)境參數(shù),就可以同步更新內(nèi)核分區(qū)信息
如:
setenv bootargs 'noinitrd console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
mtdparts=nand_flash:128k(u-boot)ro,64k(u-boot envs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'
內(nèi)核配置時選上Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
在設置了mtdparts變量之后,就可以在nand read/write/erase命令中直接使用分區(qū)的名字而不必指定分區(qū)的偏移位置.而這需要內(nèi)核MTD最好沒有規(guī)劃分區(qū)。
如果你是通過uboot的內(nèi)核命令行給MTD層傳遞MTD分區(qū)信息,這種情況下,內(nèi)核讀取到的分區(qū)信息始終和u-boot中的保持一致(推薦的做法)
如果你是把分區(qū)信息寫在內(nèi)核源代碼MTD里定義好的方法,那最好保證它和u-boot中的保持一致,即同步修改uboot及內(nèi)核的相關(guān)部分。
本篇文章來源于 Linux公社網(wǎng)站(www.linuxidc.com) 原文鏈接:http://www.linuxidc.com/Linux/2011-03/33599.htm