全部博文(153)
分类:
2009-06-22 12:59:47
很抱歉,前段时间比较忙,一直没有继续我的yaffs理解篇。今天来一起看一下我认为是理解yaffs文件系统中最重要的函数yaffs_mount。
(当然最重要也意味着最复杂,这个函数是最庞大的一个,一层套一层,让我想到了“一个馒头引发的血案”中的经典台词,圆环套圆环娱乐城)
在进行代码分析之前,先总体阐述下yaffs_mount的工作:
1. 将指定的nand设备挂载并检查用户指定的设备是否合法,当然这里的nand设备也可以是nandflash的一个分区
2. 对挂载的设备进行进一步的初始化(我在yaffs理解第二篇——yaffs_startup函数解析提到,在starup时其实已经对设备进行一个最基本的初始化)
3. 建立root、lostfound目录,这些目录是fake目录,仅仅存在在内存中,起到辅助yaffs文件系统的运行的作用,不是真实存在在nandflash上。
4. 扫描整个挂载设备的所有nand页。这一步是整个yaffs_mount的核心,因此是yaffs文件系统的核心的核心,下面我把这一步的工作分成几部分来叙述。
a) 扫描的工作会分成块扫描和页扫描两个层次来进行。
b) 首先进行块扫描,检查是否是坏块,如果是坏块,直接跳过页扫描步骤,进行下一块的扫描。
c) 如果块扫描的结果是好块,将进入页扫描步骤。页扫描将对一块的32页进行分析。通过读取每一页的oob区(也就是最后的16个字节)来判断这一页属于什么类型,基本的类型可以分为:已删除页,未使用页,数据页面,头页面。
●对于已删除页会直接进行下一页的扫描。
●对于未使用页,会判断是否是这一块的第一页,如果是一块的第一页是未使用,yaffs会认为这一块都是未使用,直接跳出页扫描,进入下一块扫描。
●对于数据页面,表示这个page是某个yaffs_object的数据,并根据该页面的oob objecteID到RAM中寻找该yaffs_object是否在RAM中建立,若建立则将该页加 入至所属的yaffs_object,否则先建立一个对应的yaffs_object,并将该页加入至对 应的yaffs_object。
●同理,对于头页面,也会做相应的操作。再根据头页面的parentobjectID到RAM 中寻找对应的父yaffs_object,形成相应的层次链接关系。
至此整个yaffs_mount的流程介绍完毕,可以看到经过了这么一个对nandflash的扫描过程,完全获得了nandflash的所有信息,并在内存中形成了一个具体层次梯度的文件系统。