全部博文(153)
分类:
2009-06-22 13:00:35
对于任何一个文件系统来说,它的最最基本的操作肯定是open, read, write, close.今天我们先从open入手来解剖yaffs是如果来完成这些最基本的操作的。
在开始读代码之前先介绍一下yaffs文件系统在操作文件经常会调用到两个函数,yaffsfs_GetHandle和yaffsfs_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. 返回文件描述符。