Linux-0-11文件系统模块笔记

概述

在Linux内核中,文件系统部分大致可以分为四个部分来看:

  1. 高速缓冲区。该部分内容集中在bufffer.c中实现。
  2. 文件系统的底层通用函数。文件索引节点的管理,磁盘数据块的分配和释放,文件名和inode之间的转换算法等。
  3. 有关对文件中数据进行读写操作,包括对字符设备,管道,块读写文件中的数据访问。
  4. 文件系统调用接口的实现,主要涉及文件打开,关闭,创建以及有关文件目录操作等的系统调用。

高速缓冲区

高速缓冲区是文件系统访问块设备中数据的必经要道。

高速缓冲区由缓冲区头和缓冲区块构成。

其物理位置位于内核代码和主内存之间。高速缓冲区块中存放着最近被使用过的各个块设备中的数据块。

当需要从块设备读取数据时,缓冲区管理程序首先在缓冲区中查找,即检索缓冲区头。如果已经存在,直接读取即可。

写入的时候,也是先写入到高速缓冲区中,至于什么时候真正的写入数据,则是要通过设备数据同步是现代的。

Linux内核实现高速缓冲区的程序是buffer.c。文件系统中其他程序通过指定需要访问的设备号和数据逻辑块号来调用它的块读写函数。

  1. 块读取函数bread()
  2. 块提前预读函数breada()
  3. 页读取函数bread_page()

文件系统底层函数

文件系统底层处理函数包含以下5个文件:

  1. bitmap.c。包括了inode位图和逻辑块位图进行释放和占用处理函数。分别有
    1. free_inode和new_inode。
    2. free_block和new_block。
  2. truncate.c。该程序包括了将数据文件长度截断为0的函数truncate()。将inode指定设备的文件长度设置为0,并释放文件数据占用的设备逻辑块。
  3. inode.c。程序包括分配inode函数iget()和放回对内存inode存取函数iput()以及根据inode节点信息取文件数据块在设备上对应的逻辑块号函数bmap()。
  4. namei.c。程序主要包括函数namei()。该函数使用iget(),iput()和bmap()将给定文件路径名映射到其inode上。
  5. super.c。专门用于处理文件系统超级块,包括了函数get_super(),put_super()和free_super()等。

文件中数据的访问

主要涉及5个文件:

  1. block_dev.c
  2. file_dev.c
  3. char_dev.c
  4. pipe.c
  5. read_write.c

文件和目录管理的系统调用

主要涉及5个文件:

  1. open.c。该文件用于实现与文件操作相关的系统调用。主要有文件的创建,打开和关闭,文件属性修改,文件访问权限修改等等
  2. exec.c。实现对二进制可执行文件和shell脚本文件的加载和执行。主要函数do_execve()。
  3. fcntl.c。实现了系统调用fcntl()和dup()等。
  4. ioctl.c。实现了输入输出控制系统调用ioctl()。主要调用tty_ioctl()函数,对中断的IO进行控制。
  5. stat.c。 实现了文件状态信息系统调用stat()和fstat()。stat是利用文件名提取信息,而fstat是利用文件描述符提取信息

待整理

Linux0.11中,最多可以加载8个文件系统,因为其超级块数组的大小为8.

超级块表在super.c的mount_root()函数中被初始化,

read_super()会为新加载的文件系统在超级块表中设置一个超级块项

put_super()函数会释放超级块表中的超级块项目

逻辑块位图用于描述每个数据块的实用情况,除了第一个比特位外,逻辑块位图的每个比特位
依次代表数据区中的一个逻辑块。因此,逻辑块位图的比特位1代表了盘上数据区中第一个数据块,
而不是第一个磁盘块。当一个数据块被使用的时候,逻辑块位图中相应的比特位被置位,由于所有
磁盘数据块都被占用的时候,查找空闲数据块的函数返回0值,因此逻辑块位图的第一个比特位闲置
不用,并且在创建文件系统的时候会预先将其设置为1.

从逻辑块的结构可以看出,逻辑块位图最多使用8个缓冲区块,每个缓冲区块的大小事1024字节,每个比特
表示了一个盘块,因此一个缓冲区块可以代表8192个盘块,8个缓冲区块总共可以表示65536个盘块,
一个盘块的大小事1K,因此Linux0.11中所能支持的最大设备容量是64MB。

inode位图用于说明inode是否被使用,同样是每个比特位代表一个inode。对于1k大小的盘块来讲,一个盘块
就可以表示8192个inode的使用情况,具体情况与逻辑块类似。

盘上的inode存放着文件系统中文件或者目录名的索引节点,每个文件或者目录名都有一个inode。每个inode结构
存放着对应文件的相关信息,文件的uid,gid,文件长度,访问修改时间,文件数据块在盘上的位置等,整个结构占用
32个字节。

文件系统目录项结构。定义在include/linux/fs.h中,在文件系统的一个目录中,其中所有文件名信息对应的目录项存储在
该目录文件名文件的数据块中。例如,目录名root/下所有文件名的目录项就保存在root/目录名文件的数据块中。而文件系统
根目录下的所有文件名信息则保存在指定inode的数据块中。其数据结构称为dir_entry。
每个目录项保存一个长度为14字节的文件名和该文件名对应的2字节的inode号码。因此一个逻辑磁盘块可以保存1024/16=64个目录项。
有关文件的其他信息则被保存在该inode号指定的inode结构之中。