Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106401
  • 博文数量: 46
  • 博客积分: 1920
  • 博客等级: 上尉
  • 技术积分: 355
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-29 14:33
文章分类
文章存档

2011年(1)

2010年(24)

2009年(21)

我的朋友

分类: LINUX

2009-09-30 16:28:53

super_read( ) 磁盘读写操作

super_read(int dev)函数的作用是从磁盘上把文件系统的超级块读到内存的缓冲区中。这个过程如下

1.首先判断参数,也就是设备号是否有效dev=0就无效的

        if (!dev) return ;

2.判断硬盘有没有被换过

(dev);

3.先去这个super_block[8]表中查找有没有dev对应的超级块,如果找到就直接返回对应的项,这个操作由这个函数struct * (int dev)来做。

否则,判断这个超级块表super_block[8]有没有被占完,没有被占用完就算占用其中一项super_block[i],都占用完的话就返回退出了。

因为linux系统支持的文件系统是有限的,0.11只支持8个文件系统。每挂载一个文件系统super_block[8]表中都会有一项被占用。

4.如果上一步的操作找到一项super_block[i]没有被使用,那就开始对这一项super_block[i]进程初始化,然后把这个项super_block[i]锁起来。这里的锁起来的意思就是sb->s_lock = 1.锁起来之后,如果有别的进程想使用这个项就要等到它解锁,也就sb->s_lock = 0.

5.在磁盘缓冲区中找到一个空闲的缓冲块然后把数据读到这个缓冲块中,这个操作是由这个函数bread(int dev,int block)来完成的。Bread( dev,block)这个函数的做用就是负责把磁盘上的的dev(设备号),block(块号)对应的数据读到磁盘缓冲区中返回的是缓冲区的缓冲块头地址。如果这个函数失败了就会返回NULL

如果没有找到空闲的缓冲块(bread失败)就会对super_block[i]进行解锁并且设置它为示被占用的状态,然后返回

6.执行到这里说明超级块已经被从磁盘上读到磁盘缓冲区(内存)中了。接下来就要从这个超级块中读出一些数据来检测这个文件系统的类型。当然不必整个超级块都去检测,只检测超级块前面的20bytes就可以了。如果检测到的是不可识别的文件系统,就会对super_block[i]进行解锁并且设置它为示被占用的状态,然后返回

7.接下来就要对i节点位图和逻辑块位图进行初始化。这里的初始化有两部分

1)对位图的数组指针struct * s_imap[8] struct * s_zmap[8];进行初始化,清0

       2)对给这些数组指针分配磁盘缓冲区,然后从硬盘中读入i节点位图和逻辑块位图数据这里再次调用bread()函数。

8.检测读出来的位图块数(读操作的时候计数)和文件系统里设置的位图块数(超级块中的值)是不是相等,如果不相等就是出错了,这时会释放上面super_block[i]还有分配了的磁盘缓冲区

9.最后把两个位图的第一位(第1bit)设置为11表示已经被占用。

10.super_block[i]解锁

 

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