网站开发三步,wordpress php版本要求,百度搜索排名规则,建设母婴网站的目的Nand/Nor Flash在嵌入式Linux产品中#xff0c;通常使用的存储介质为Nand Flash和Nor Flash#xff0c;而手机、相机等产品通常使用eMMC、SD Card作为存储介质#xff0c;导致这种差异的原因主要是成本考量。Nand Flash和Nor Flash具有低成本、高密度存储的优势。但是#…Nand/Nor Flash在嵌入式Linux产品中通常使用的存储介质为Nand Flash和Nor Flash而手机、相机等产品通常使用eMMC、SD Card作为存储介质导致这种差异的原因主要是成本考量。Nand Flash和Nor Flash具有低成本、高密度存储的优势。但是它们在读写操作上又有各自的限制。Nand Flash和Nor Flash都没有片内FTL(Flash Transfer Layer)层换句话说它们都是raw flash。也就是说本质上它们都是字符设备。未填写数据的时候所有位都是高电平写操作是将高电平变为低电平只有擦操作才能将低电平变为高电平。所以Nand Flash和Nor Flash的写操作都只能通过先擦除再写入完成读操作没有限制。Nand Flash通常用来存储数据它通过页(Page)和块(Block)两级结构组成页大小通常为512Byte类似于磁盘块大小为8~32KB。读取和写入以页为单位进行擦操作以块为单位进行。另外针对每一页有16字节的OOB区用来存放额外的信息以及ECC纠错码。Nand Flash比较容易出现坏块其生命周期是擦写100万次。Nor Flash通常用来存代码因为它具有XIP(eXecute In Place)的特性即片上执行CPU可以把它当RAM使用同时它也可以保存数据。Nor Flash的页大小通常为32Byte块大小为128KB芯片内部包含512Byte的写缓冲区。Nor Flash具有随机读和页读两种方式擦除操作则是以块为单位即128KB。Nor Flash在擦除操作之前必须对每一位写0。Nor Flash的读速度比Nand Flash快擦除和写入速度则比Nand Flash慢。另外Nor Flash没有芯片内部的坏块处理因为它比较少出现坏块其生命周期是擦写10万次。MTD(Memory Technology Devices)MTD子系统在raw flash上提供了一层抽象层并提供统一的API接口给文件系统层这样文件系统就不用关心实际的Flash类型是Nand Flash还是Nor Flash。MTD子系统有以下三种接口1) mtd字符设备/dev/mtd0, /dev/mtd1等通常包括一组ioctl进行读取、擦除、写入、标记坏块、获取flash信息等操作2) sysfs 参考Documentation/ABI/testing/sysfs-class-mtd3) /proc/mtdMTD子系统给文件系统层提供的API都在include/linux/mtd/mtd.h中描述其中最重要的是mtd_info结构体。内核3.4版本之前文件系统层通过mtd_info的成员函数指针调用接口函数内核3.4版本以后通过mtd.h文件中声明的mtd_read() mtd_write()等函数实现。MTD既可以是字符设备也可以是块设备。mtdblock驱动是一个过时的工具用来在mtd设备之上模拟块设备。它不进行坏块处理所以不能用于Nand Flash。它的工作原理是通过缓存数据块来实现修改操作在内存中缓存的数据块进行然后擦除实际物理块再将缓存的数据写入物理块。这样会出现掉电的时候数据丢失的现象。另外它也不进行wear-leveling和bit-flips(位反转)处理。通常将mtdblock理解为FTL层其实这种认知是错误的尽量不要使用mtdblock除非你知道自己在干什么。YAFFS/JFFS2/SQUASHFS/UBIFS文件系统mkimageuboot源代码的tools/目录下有mkimage工具这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。为什么uboot下会有这个工具呢因为bootloader的类型有很多种不同的bootloader在加载和启动内核时的方式大体上一致但是具体实施上有细微的区别mkimage的目的是在linux内核镜像文件(zImage)的基础上加上一段uboot可以识别的头部信息用来解析和加载内核镜像通常最终生成的镜像文件名为uImage。该头部信息大小为0x40字节记录mkimage参数所指定的信息比如CPU体系结构、OS类型、镜像文件类型、内核镜像加载到内存的地址、压缩格式等。Usage: ./mkimage -l image-l list image header information./mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image-A set architecture to arch-O set operating system to os-T set image type to type-C set compression type comp //压缩格式可选none/gzip/bzip2-a set load address to addr (hex) //内核加载到内存的地址-e set entry point to ep (hex) //内核加载到内存的地址0x40 (跳过0x40的头部该参数可以忽略)-n set image name to name-d use image data from datafile-x set XIP (execute in place)./mkimage [-D dtc_options] -f fit-image.its fit-image./mkimage -V print version information and exit参数说明-A 指定CPU的体系结构取值 表示的体系结构alpha Alphaarm A RMx86 Intel x86ia64 IA64mips MIPSmips64 MIPS 64 Bitppc PowerPCs390 IBM S390sh SuperHsparc SPARCsparc64 SPARC 64 Bitm68k MC68000-O 指定操作系统类型可以取以下值openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos-T 指定映象类型可以取以下值standalone、kernel、ramdisk、multi、firmware、、filesystem-C 指定映象压缩方式可以取以下值none 不压缩gzip 用gzip的压缩方式bzip2 用bzip2的压缩方式-a 指定映象在内存中的加载地址映象下载到内存中时要按照用mkimage制作映象时这个参数所指定的地址值来下载-e 指定映象运行的入口点地址这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)-n 指定映象名-d 指定制作映象的源文件示例mkimage -n linux-2.6.14 -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.imgvmlinux/Image/zImageLD vmlinux 内核编译完成之后链接各目标文件生成ELF格式vmlinuxSYSMAP System.mapSYSMAP .tmp_System.mapOBJCOPYarch/arm/boot/Image 通过objcopy提取vlinux中的代码段和数据段并打包生成arch/arm/boot/ImageKernel:arch/arm/boot/Image is readyAS arch/arm/boot/compressed/head.oGZIParch/arm/boot/compressed/piggy.gzAS arch/arm/boot/compressed/piggy.oCCarch/arm/boot/compressed/misc.oASarch/arm/boot/compressed/head-xscale.oLDarch/arm/boot/compressed/vmlinux 通过gzip压缩arch/arm/boot/Image并添加解压程序等生成ELF格式的arch/arm/boot/compressed/vmlinuxOBJCOPYarch/arm/boot/zImage 通过objcopy提取arch/arm/boot/compressed/vmlinux中的代码段和数据段生成可以放在内存任意地址直接执行的arch/arm/boot/zImage