一个比较大的工程,最最核心的往往是数据结构体的定义,这是我最近一段时间啃yaffs啃出来的体会,一个复杂的函数往往是因为里面包含了各类结构体,结构体成员函数之间的不断转换,因此想要理解好一个大型的软件,一定要深刻的理解它的核心结构体。
话说有一天和trio一起吃饭,trio老师谈到他看代码的习惯,说往往是先不看.c文件,先把头文件仔细读一遍,这点真是深刻啊!
我的理解核心数据就像整个代码的经络一样,别看这个程序有多少多少万行代码,它本质上就是在对这些结构体进行操作。废话少说,我们来看一下yaffs的核心结构体。
Yaffs的主要的结构体在yaffs_guts.h这个文件中,核心的接头体有:
struct yaffs_DeviceStruct
struct yaffs_ObjectStruct
Struct yaffs_ObjectHeader
//Struct yaffs_blockinfo
Struct yaffs_spare
Struct yaffs_tags
//Struct yaffs_chunkcache
还有一个比较重要的结构体在yaffs_fs.h这个文件中
Struct yaffsfs_Handle
当然还有其他很多结构体,这里先把主要的列在这儿,我准备从物理上和逻辑上的区分来说明这些结构体的作用,请看下面这张表。
结构体名字 |
属性(物理,逻辑) |
作用 |
yaffs_DeviceStruct |
物理 |
是描述了整个挂载的设备(大小,起始地址,读写操作的函数等等) |
yaffs_spare |
物理 |
描述了nandflash每一页后的16个字节 |
yaffs_ObjectHeader |
物理,逻辑 |
存在于nandflash上,这是物理特性,它的内容是描述了一个文件信息,这是逻辑特性 |
yaffs_ObjectStruct |
逻辑 |
描述了一个文件的具体信息 |
yaffsfs_Handle |
逻辑 |
描述了访问文件的信息,读写特性,文件偏移量,文件的yaffs_objectstruct |
yaffs_tags |
逻辑 |
它其实是yaffs_spare的一部分,yaffs利用tags中的内容对yaffs进行组织 |
因此可以这么来说实际和nandflash的硬件相关的结构体有三个,其他的结构体都是只是为了维护yaffs的组织目录而在内存中形成的。所以,