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

2012年(7)

2010年(35)

2009年(111)

分类:

2009-06-22 13:00:35

对于任何一个文件系统来说,它的最最基本的操作肯定是open, read, write, close.今天我们先从open入手来解剖yaffs是如果来完成这些最基本的操作的。

 

在开始读代码之前先介绍一下yaffs文件系统在操作文件经常会调用到两个函数,yaffsfs_GetHandleyaffsfs_GetHandlePointer

yaffs文件系统定义了一个全局的结构体数组,yaffsfs_handle[yaffs_N_HANDLES],也就是存放文件描述符的数组,因此创建一个文件就是要从这个数组中获得一个空闲的成员,而yaffsfs_GetHandle就是获得这个成员(文件描述符)的数组标号,yaffsfs_GetHandlePointer就是这个成员(文件描述符)的地址。

 

1.       综上所述,在open一个文件的时候,首先会通过yaffsfs_GetHandle获得一个文件描述符,当然在实际的对这个描述符的操作会通过yaffsfs_GetHandlePointer获得这个文件描述符的地址来进行操作。

2.       一旦建立好文件描述符,yaffs会通过传进来的path参数来辨别这个文件是已经存在还是需要建立的,即通过函数obj = yaffsfs_FindObject(NULL,path,0);

a)         如果这个obj已经存在,yaffs会通过一个循环来检测这个文件是否被打开,是否被使用。

for(i = 0; i <= YAFFSFS_N_HANDLES; i++)

{

//这条if语句的意思是,如果有一个另外的文件描述符,它在使用,而且它的obj对应我们现在使用的obj,就认为这个obj已经被打开了。                   

       if(i != handle && yaffsfs_handle[i].inUse && obj == yaffsfs_handle[i].obj)

       {

              alreadyOpen = 1;

              if(yaffsfs_handle[i].exclusive)

              {

                     alreadyExclusive = 1;

              }

       }

}

yaffs会根据open后面跟的标志位参数的不同进行处理。比如标志位定义了O_EXCL就代表是独占,此时认为文件是一个临界资源,如果被其他的应用程序打开了,这次就不能被打开。

除了open的标志位限制,还跟这个obj本身的属性有关,yaffs也会根据obj->yst_mode进行比较处理。

 

b)        如果这个obj不存在,看标志位是否是O_CREAT,如果是创建文件。

 

3 如果文件已有了(不管是通过查找找到以前的,还是新建立的),并且允许打开,则给文件描述符结构体进行赋值。否则的话讲这个文件描述符置空,归还给yaffsfs_handle[yaffs_N_HANDLES],保证下次使用。

 

4. 返回文件描述符。

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