广西翔路建设有限责任公司网站,wap站是什么意思啊,丽水网站建设公司,python基础教程入门今天做内核移植#xff0c;准备添加NAND flash的驱动#xff0c;做到MTD分区时#xff0c;想起在一本书上看到的一句话#xff0c;说的是分区时每个区之间没有间隙#xff0c;前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时#xff0c;分区如下准备添加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的分区信息 bootargsnoinitrd root/dev/mtdblock2 init/linuxrc consolettySAC0 mtdpartsmtdpartsnandflash0:256k0(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分区也是如此而且与内核分区相比文件系统的分区将显得更加重要因为将直接影响到根文件系统能否挂载这里是因为上面提到的一行 bootargsnoinitrd root/dev/mtdblock2 init/linuxrc consolettySAC0 这里uboot指定了根文件系统的代码来自于mtdblock2也就是MTD分区的第三个分区(第一个编号为0)也就是我上面说到的uboot完成初始化后加载内核而内核要完成文件系统的挂载他从哪里找文件系统就是这里/dev/mtdblock2! 所以现在我们看到MTD分区的原因而且最关键的在这里其他分区如果与uboot的分区不一致还情有可原但如果MTD分区中文件系统的分区与uboot中的root分区不一致将会直接导致系统无法启动 当然之前操作的都是物理地址当内核真正运行起来以后将开始使用虚拟地址。