了解一个文件系统,除了了解运行机制(RAM结构)外,还需了解文件系统怎样物理存储的。RAM数据结构是为文件系统更好运行,而物理存储是文件系统载体。文件系统出问题后,最终要从物理存储寻找数据。
参考“How Yaffs Works”,文件数据都以顺序日志形式写到flash中,日志的每个entry都是一个chunk大小,所存的数据类型有两种:
>>Data chunk: A chunk holding regular data file contents.
>>Object Header: A descriptor for an object(directory, regular data file, hard link, soft link, special descriptor, …). This holds details such as the identifier for the parent directory, object name, etc.
每个chunk都含有tags(默认存储在oob中),yaffs1的tags和yaffs2 tags不同,下以yaffs2为例进行说明。
即yaffs数据都以chunk(one page)为单位存储,每个chunk包含数据和标签(tags),chunk数据为文件系统实际数据;tags为yaffs文件系统需要,根据chunk数据属性而得。Chunk数据分为两类:一类为Data chunk,存储普通文件的内容(直接一字节一字节拷贝到flash,页未满时补0xFF,实为memset 0xFF而得),yaffs未分配具体数据结构(直接拷贝内容即可);另一类为所有文件(目录、普通文件、硬连接、软连接、字符设备、块设备、FIFO、Socket)的头,存储相关文件属性,yaffs提供struct yaffs_obj_hdr数据结构,该数据结构直接存储到一个chunk(一页page)上。根据utils/mkyaffs2image.c可知上述描述的详细过程。
根据上面描述,实际存储到flash上的数据结构有两种:struct yaffs_obj_hdr和struct yaffs_packed_tags2。(若包含其他特性,checkpoint、inband tags、Block summaries、extended tags,即flash存储其他信息提高flash性能,则flash上存储的数据结构更多。)utils/mkyaffs2image.c通过扫描整个yaffs文件系统,根据文件提取struct yaffs_obj_hdr和struct yaffs_packed_tags2,直接写到yaffs镜像中。
sizeof(struct yaffs_packed_tags2) = 28;
sizeof(struct yaffs_obj_hdr) = 512;
//yaffs_packedtags2.h
struct yaffs_packed_tags2_tags_only {
unsigned seq_number; //块序列号,每写一次加1,初始0x10000
unsigned obj_id; //对象id,每个对象唯一,初始0x101
unsigned chunk_id; //0,对象头;>0,该chunk在文件中位置
unsigned n_bytes; //chunk数据字节数,若为对象头则为0xFFFF
};
struct yaffs_packed_tags2 {
struct yaffs_packed_tags2_tags_only t;
struct yaffs_ecc_other ecc; //tags ECC校验,非chunk数据
};
//yaffs_ecc.h
struct yaffs_ecc_other {
unsigned char col_parity;
unsigned line_parity;
unsigned line_parity_prime;
};

//yaffs_guts.h
enum yaffs_obj_type {
YAFFS_OBJECT_TYPE_UNKNOWN,
YAFFS_OBJECT_TYPE_FILE,
YAFFS_OBJECT_TYPE_SYMLINK,
YAFFS_OBJECT_TYPE_DIRECTORY,
YAFFS_OBJECT_TYPE_HARDLINK,
YAFFS_OBJECT_TYPE_SPECIAL
};
struct yaffs_obj_hdr {
u32 type; /* enum yaffs_obj_type */

/* Apply to everything */
u32 parent_obj_id;
u16 sum_no_longer_used; /* checksum of name. No longer used */
YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];

/* The following apply to all object types except for hard links */
u32 yst_mode; /* protection */

u32 yst_uid;
u32 yst_gid;
u32 yst_atime;
u32 yst_mtime;
u32 yst_ctime;

/* File size applies to files only */
u32 file_size_low;

/* Equivalent object id applies to hard links only. */
int equiv_id;
/* Alias is for symlinks only. */
YCHAR alias[YAFFS_MAX_ALIAS_LENGTH + 1];

u32 yst_rdev; /* stuff for block and char devices (major/min) */

u32 win_ctime[2];
u32 win_atime[2];
u32 win_mtime[2];

u32 inband_shadowed_obj_id;
u32 inband_is_shrink;

u32 file_size_high;
u32 reserved[1];
int shadows_obj; /* This object header shadows the
specified object if > 0 */

/* is_shrink applies to object headers written when wemake a hole. */
u32 is_shrink;

};

附注yaffs2镜像首页内容:
~$hexdump -C wang_yaffs2 | more
00000000 03 00 00 00 01 00 00 00 ff ff 74 6d 70 00 00 00 |..........tmp...|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100 00 00 00 00 00 00 00 00 00 00 ff ff ed 41 00 00 |.............A..|
00000110 00 00 00 00 00 00 00 00 29 c4 e8 57 32 68 fa 56 |........)..W2h.V|
00000120 41 bb e4 57 ff ff ff ff ff ff ff ff ff ff ff ff |A..W............|
00000130 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
000001c0 ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00 00 |................|
000001d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000800 ff ff 00 10 00 00 01 01 00 00 00 00 00 00 ff ff |................|
00000810 00 00 25 00 00 00 00 00 00 00 ff ff ff ff ff ff |..%.............|
00000820 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000840 03 00 00 00 01 00 00 00 ff ff 73 62 69 6e 00 00 |..........sbin..|
说明:上图表示的红色部分为yaffs2 tags数据,前面两个字符用作坏块标记(后面具体说明)。该镜像文件有默认源码mkyaffs2image基础上oob部分头两字节空置为0xFF所得。实际测试nandflash烧写该镜像后,文件系统仅启动一部分,之后停止不再显示信息。
后注:程序停止的原因为mkyaffs2image.c(即制作镜像工具)问题,其在打包镜像时,对于普通文件大小设置错误。在文件头中设置文件大小有file_size_low和file_size_high两部分组成(对普通文件有效),而对于普通文件,c中都通过stat.st_size>>32设置,而stat.st_size本身为32位,右移32位实际值仍为原值,导致文件设置大小过大。导致运行第一个文件时即停止不再运行。

yaffs2物理存储的更多相关文章

  1. MongoDB【第二篇】MongoDB逻辑与物理存储结构

    基本的操作 一.常用的命令和基础知识 1.进入MongoDB sehll 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...

  2. Innodb物理存储结构系列1

    本篇先介绍 下Innodb表空间,文件相关的内存数据结构. 1. 数据结构 Innodb的tablespace和文件的关系,是一对多的关系,先来看三个结构体 1. fil_system_struct: ...

  3. InnoDB的表类型,逻辑存储结构,物理存储结构

    表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...

  4. 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西.图其实就是树结构的升级版.上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些树结构的应用.本篇博客我们就讲图的存储结 ...

  5. DBMS_ROWID定位数据行物理存储位置

    对于Oracle中的堆表,我们可以通过oracle内置的ROWID伪列得到对应行记录所在的ROWID的值(注意,这个ROWID只是一个伪列,实际的块中并不存在该列).然后我们可以通过DBMS_ROWI ...

  6. MongoDB----逻辑与物理存储结构

    基本的操作 一.常用的命令和基础知识 1.进入MongoDB shell 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...

  7. 专题实验 Storage structure 物理存储

    物理存储结构主要是指: extent的分配, 以及datablock 存储相关, 置于tablespace, segment 都是逻辑结构. tablespace : 逻辑结构, 没有实际物理存储. ...

  8. Oracle 体系结构四 逻辑和物理存储结构之间的关系

    Oracle数据库从物理存储中完全抽象出逻辑存储.逻辑数据存储采用“段”的形式.段的类型有很多种:典型的段是“表”.这些段以物理形式存储在数据文件中.通过表空间将逻辑存储从物理存储中抽象出来.逻辑结构 ...

  9. Atitit.数据库表的物理存储结构原理与架构设计与实践

    Atitit.数据库表的物理存储结构原理与架构设计与实践 1. Oracle和DB2数据库的存储模型如图: 1 1.1. 2. 表数据在块中的存储以及RowId信息3 2. 数据表的物理存储结构 自然 ...

随机推荐

  1. Nginx 笔记与总结(15)nginx 实现反向代理 ( nginx + apache 动静分离)

    在 nginx 中,proxy 用来实现反向代理,upstream 用来实现负载均衡. 例如有两台服务器,nginx 服务器作为代理服务器,执行 .html 文件,apache 服务器上执行 .php ...

  2. Javascript 笔记与总结(1-4)this

    js 中函数的 4 种调用方式: ① 作为普通函数来调用,this 的值指向 window,准确地说,this 为 null,被解释成为 window.在 ECMAScript5 标准中,如果 thi ...

  3. WEB系统开发

    最近根据项目组需求做了web工作流程系统,就是一个简单的web管理系统,取代原先使用的excel表格,在VS2008下面开发,数据库使用Mysql,使用Mysql-connecte 5.0与数据库连接 ...

  4. Solr定时更新

    今天用到solr定时重建索引和增量更新技术,就从网上搜了一些资料,在这里给大家整理了一下,也经过了自己的测试,没有异常. Solr官方提供了很强大的Data Import Request Handle ...

  5. T-SQL笔记

    主要是查询: select *|Cols_Name|聚合函数 from Table_Name;#这是基本的语法 聚合函数: count(*|Cols_Name)   计算表的数量 max(*|Cols ...

  6. Machine Learning in Action -- AdaBoost

    初始的想法就是,结合不同的分类算法来给出综合的结果,会比较准确一些 称为ensemble methods or meta-algorithms,集成方法或元算法 集成方法有很多种,可以是不同算法之间的 ...

  7. linux下常用的命令

    一.  tomcat  tail -f ../logs/catalina.out                        最新更新的日志(tomcat) cat ../logs/catalina ...

  8. ORACLE的安装与网页版创建表空间的简单操作以及PLsql的简单操作

    1.oracle的安装: 安装简单易学,在这里不做解释.下载看装包后耐心等待,注意安装目录不要有中文字符,尽量按照指定目录进行安装.安装完成后会占用有大约5g的内存. 如果要卸载oracle,需要用其 ...

  9. 转:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

    在Win7 64位系统下,使用Java+Access数据库编程,用Java连数据库时,出现错误提示,如下: Java java.sql.SQLException: [Microsoft][ODBC 驱 ...

  10. eclipse dbviewer,eclipse java8

    进入/home/xxx(用户名)/.local/share/applications,看是否有eclipse和深度音乐desktop配置文件,为eclipse.desktop配置图标, 那现在终端输入 ...