对于NandFlash的认识尝试不做更多理解,只需要了解非易失存储、擦除寿命有限、通常是10K级别,同时写操作需要基于Page
来。没有办法按照内存的存储基本单位字节来操作,由多个Page
组成一个Block
每个 Page
保留 一些字节用以 做ECC ( error correcting code )校验。
通常按照如下分布。
32 pages of 512+16 bytes each for a block size (effective) of 16 KB
64 pages of 2,048+64 bytes each for a block size of 128 KB[42]
64 pages of 4,096+128 bytes each for a block size of 256 KB[43]
128 pages of 4,096+128 bytes each for a block size of 512 KB.
NandFlash 支持坏块管理,当上层应用通过逻辑块访问Flash的时候,驱动器控制器会把坏块重映射到好的物理块,基于此实现,FLash的一些块需要用来存储坏块信息。 或者系统会在上电时候读取出所有坏块信息存储到RAM。
绝大部分NAND 出厂就伴随着一些坏块信息,但是通常在出厂前都会进行一个坏块标记处理工序。
GUIP和MBR。
先说MBR,很熟悉了。早些年折腾系统装机就详细了解过,区分主分区+扩展分区。因为首先分区表文件大小512字节,所以 主分区数量 m ,0<m<=4,扩展分区数量 e, 0<=e<4, 扩展分区和主分区 总共 0<e+m<=4。扩展分区可以增加理论上的不限制数量的逻辑分析。
GUID 分区是 基于 Unified Extensible Firmware Interface 规范实现,通过GUID或UUID方式实现分区类型。
多个分区方便我们选择不同的文件系统和挂载选项(只读、读写)
An introduction to Linux filesystems
An introduction to Linux's EXT4 filesystem
对于文件系统的叫法,我们需要区分场景。
EXT3, EXT4, BTRFS, XFS
。每种数据文件系统类型定义自己的 metadata
元数据以及如何存储和读写数据。而对于文件的功能,包含以下:
What is an inode? Short for index-node, an inode is a 256-byte block on the disk and stores data about the file. This includes the file's size; the user IDs of the file's user and group owners; the file mode (i.e., the access permissions); and three timestamps specifying the time and date that: the file was last accessed, last modified, and the data in the inode was last modified.
详细可以参考 inode pointer structure。
如上,对于EXT4文件系统文件的接近都是通过 蓝色 Directory Entry
目录入口,其包含文件名、文件所在INode ID,改ID作为文件在文件系统的唯一标志符,作为文件INode 元数据的入口。
尽管INode的指针数据是唯一的,但是也只是相对该分区的文件系统。
如上绿部分作为INode 元数据,描述文件用户、文件类型、文件接近时间、文件大小等信息。
黄色部分描述文件的有效数据信息,包含数据位置和大小。保留15个数据块,其中12个直接描述文件数据指针,3个间接INode。我们通过可以12个直接数据块指针指定定位到文件数据位置。3个直接数据块其实描述的是iNode数据,我们需要通过这3个间接iNode数据的数据信息再定位到直接数据指针。之所以这样设计,使我们在使用文件系统过程中无可避免产生文件碎片化。
Check and Repair Your Filesystem With fsck [Linux]
对于文件系统的损坏和损毁(corrupted or damage),我们应该做周期性的文件系统检查。
由于Flash Page擦除的的物理特性。所以在Falsh的文件系统选择上有所有考虑。