第三章第五节 MTD分区 [url=]Memory Technology Device[/url],缩写为 MTD,即为内存技术设备,是Linux系统中快闪存储器转换层。创造MTD子系统的主要目的是提供一个介于快闪存储器硬件与上层应用之间的抽象接口。 因为具备以下特性,所以 MTD 设备和硬盘相较之下,处理起来要复杂许多: 1) 具有 eraseblocks 的[url=]特微[/url] ,而不是像硬盘一样使用簇。 2) eraseblocks (32KiB ~ 128KiB) 跟硬盘的 sector size(512 到 1024 bytes)比起来要大很多。 3) 操作上主要分作三个动作:从 eraseblock 读取、写入 eraseblock 、还有就是清除 eraseblock 。 4) 坏掉的 eraseblocks 无法隐藏,需要软件加以处理。 5) eraseblocks 的寿命大约会在 104 到 105 的清除动作之后退出。 进入arch/arm/mach-s3c64xx目录,打开mach-ok6410.c文件。可以看到MTD分区信息如下: static struct mtd_partition ok6410_nand_part[] = { [0] = { .name = "uboot", .size = SZ_1M, .offset = 0, }, [1] = { .name = "kernel", .size = SZ_2M, .offset = SZ_1M, }, [2] = { .name = "rootfs", .size = MTDPART_SIZ_FULL, .offset = SZ_1M + SZ_2M, }, }; Linux-3.8.3的源码将NandFlash划分为3个分区:前1M用于存放u-boot,1M后面的2M空间之间用于存放内核,3M之后的空间用来存放虚拟文件系统。rootfs文件系统是基于内存的文件系统,也是虚拟的文件系统,在系统启动之后,隐藏在真正的根文件系统后面,不能被卸载。 这里需要对NandFlash重新划分分区,是的这个MTD分区适合OK6410开发平台,也能适合当前的u-boot、内核、文件系统以及用户。修改如下: static struct mtd_partition ok6410_nand_part[] = { [0] = { .name = "Bootloader", .offset = 0, .size = (1 * SZ_1M), .mask_flags = MTD_CAP_NANDFLASH, }, [1] = { .name = "Kernel", .offset = (1 * SZ_1M), .size = (5 * SZ_1M) , .mask_flags = MTD_CAP_NANDFLASH, }, [2] = { .name = "File System", .offset = (6 * SZ_1M), .size = (200 * SZ_1M) , }, [3] = { .name = "User", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, }, }; 将NandFlash划分成了4个MTD分区,其中0~1M之间的空间用来存放Bootloader,也就是u-boot,1M~6M之间的空间用来存放linux内核,6M~206M之间的空间用来存放文件系统,剩下的空间提供给用户使用。 修改完成之后,执行make uImage重新生成内核。将uImage重命名为zImage,使用TFTP调试内核。 tftp 0x50008000 zImage bootm 0x50008000 由于还没有添加NandFlash驱动,所以串口输出信息暂时无法看到MTD分区信息。 [url=]注:本节配套视频位于光盘中“嵌入式Linux实用教程视频”目录下第三章05课(MTD分区)。[/url] |