Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006754
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-06-22 12:59:47

很抱歉,前段时间比较忙,一直没有继续我的yaffs理解篇。今天来一起看一下我认为是理解yaffs文件系统中最重要的函数yaffs_mount

(当然最重要也意味着最复杂,这个函数是最庞大的一个,一层套一层,让我想到了“一个馒头引发的血案”中的经典台词,圆环套圆环娱乐城)

 

在进行代码分析之前,先总体阐述下yaffs_mount的工作:

1.      将指定的nand设备挂载并检查用户指定的设备是否合法,当然这里的nand设备也可以是nandflash的一个分区

2.      对挂载的设备进行进一步的初始化(我在yaffs理解第二篇——yaffs_startup函数解析提到,在starup时其实已经对设备进行一个最基本的初始化

3.      建立rootlostfound目录,这些目录是fake目录,仅仅存在在内存中,起到辅助yaffs文件系统的运行的作用,不是真实存在在nandflash上。

4.      扫描整个挂载设备的所有nand页。这一步是整个yaffs_mount的核心,因此是yaffs文件系统的核心的核心,下面我把这一步的工作分成几部分来叙述。

a)        扫描的工作会分成块扫描和页扫描两个层次来进行。

b)        首先进行块扫描,检查是否是坏块,如果是坏块,直接跳过页扫描步骤,进行下一块的扫描。

c)        如果块扫描的结果是好块,将进入页扫描步骤。页扫描将对一块的32页进行分析。通过读取每一页的oob区(也就是最后的16个字节)来判断这一页属于什么类型,基本的类型可以分为:已删除页,未使用页,数据页面,头页面。

●对于已删除页会直接进行下一页的扫描。

●对于未使用页,会判断是否是这一块的第一页,如果是一块的第一页是未使用,yaffs会认为这一块都是未使用,直接跳出页扫描,进入下一块扫描。

●对于数据页面,表示这个page是某个yaffs_object的数据,并根据该页面的oob      objecteIDRAM中寻找该yaffs_object是否在RAM中建立,若建立则将该页加         入至所属的yaffs_object,否则先建立一个对应的yaffs_object,并将该页加入至对              应的yaffs_object

●同理,对于头页面,也会做相应的操作。再根据头页面的parentobjectIDRAM   中寻找对应的父yaffs_object,形成相应的层次链接关系。

 

至此整个yaffs_mount的流程介绍完毕,可以看到经过了这么一个对nandflash的扫描过程,完全获得了nandflash的所有信息,并在内存中形成了一个具体层次梯度的文件系统。

阅读(4534) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~