Chinaunix首页 | 论坛 | 博客
  • 博客访问: 699004
  • 博文数量: 193
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2187
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(193)

文章存档

2024年(9)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: LINUX

2016-07-08 22:19:48

linux内核资料收集

1. 虚拟文件系统是什么
 Linux支持多种不同文件系统将对各种不同文件系统和管理纳入到一个统一的框架中,为用户程序提供一个统一的、抽象的、虚拟的文件系统界面,对每个读写或其它函数,内核都能把它替换成支持本地linux文件系统,或文件所在的任何其它文件系统的实际函数,对用户程序隐去各种不同文件系统的细节。这就是所谓的"虚拟文件系统"VFS(Virtual Filesystem),也称之为“虚拟文件系统转换”(Virtual Filesystem Swith, VFS)。
    

2. VFS支持文件系统类型
    a. 磁盘文件系统
        如,ext2/ext3/ext4/reiserfs/xfs/ntfs....
    b. 网络文件系统
        如,nfs/cifs...
    c. 其它特殊文件系统
        如,proc/sys...

3. 虚拟文件系统的主要对象及数据结构
    a. superblock
        存放特定加载的一个文件系统信息。
        文件系统的操作方法:super_operations
            alloc_inode()/read_inode()/write_inode()/sync_fs等
    b. inode
        存放一个特定的文件信息
        相应的操作方法:inode_operations
            create()/link()/mkdir()/mknod()等
    c. dentry
        一个目录项, 路径的一个组成部分。
  相应的操作方法: dentry_operations 
            d_compare()/d_delete()等
    d. file
        进程打开的一个文件
  相应的操作方法:file_operations
            open()/release()/flush()/read()/write()/llseek()等
    下图是进程与文件交互示例
    
3.1 linux的文件系统
    a. linux提供了的文件系统相关抽象:文件、目录项、inode和挂载点
    b. 关于文件系统
     1>.文件系统是在特定的结构上,存储层次化的数据。文件系统包含文件、目录和相关的控制信息。
        2>.在文件系统上的操作通常有:创建、删除和挂载。
        3>.文件系统挂载在全局文件层次结构中的一个节点上, 这个文件层次结构称为名空间(namespace)
 c. 关于文件
        1>.文件是有顺序的字节流。
        2>.每个文件都有一个(人类)可阅读的文件名。
        3>.常用的文件操作包括读、写、创建和删除。
    d. 关于目录
        1>.文件存放在目录里。
        2>.目录和文件夹类似,它通常包含文件;目录也可以有子目录。
        3>.目录交织形成路径,路径的每个组成部分被称为目录项(directory entry)。
                如“/root/ssd/zl”,根目录/,目录root、ssd和文件zl都是目录项。
        4>.在linux中,目录也是普通的文件,只是文件的内容就是目录中的所有文件名。
        5>.对于VFS来说,目录就是一个文件,所有对文件的操作也可用在目录上。
    3. 关于inode
        linux系统将文件数据和文件本身信息(属性)分开,文件访问权限、大小、拥有者、创建时间等。这些信息称为file metadata。
        这就是inode,它们和文件数据分开存储,
    4.关于superblock
        文件系统的控制信息存放在超级块(superblock)中。
        超级块是包含文件系统信息的数据结构,有时这些文件系统信息称之为filesystem metadata。

3.2超级块对象
    a>.超级块(spuerblock)对象由各自的文件系统实现,用来存储文件系统的信息。
    b>.这个对象对应为文件系统超级块或者文件系统控制块, 它存储在磁盘特定的扇区上。
    c>.不是基于磁盘的文件系统(基于内存的虚拟文件系统, 如sysfs)临时生成超级块,并保存在内存中。
    d>.超级块对象由结构struct super_block表示,定义在中。
3.3索引节点对象
    a>.索引节点对象包含了内核在操作文件或目录时需要的全部信息。
    b>.对于Unix文件系统来说,这些信息可以从磁盘索引节点直接读入。
    c>.如果一个文件系统没有索引节点,那么,不管这些相关信息在磁盘上是怎么存放的,文件系统都必须从中提取这些信息。
    d>.索引节点对象由inode结构体表示,定义在文件linux/fs.h

    一个索引节点代表文件系统中的一个文件,它也可以是设备或管道这样的特殊文件。因此索引
节点结构体中有一些和特殊文件相关的项,比如i_pipe项就指向一个代表命名管道的数据结构。如
果索引节点并非代表一个命名管道,那么该项就被简单地设置为NULL。和特殊文件相关的项还有
i_devices、i_bdev和i_cdev等。
    e>.索引节点操作
        索引节点对象中的inode_operations项, 描述了VFS用以操作索引节点对象的所有方法, 这些方法由文件系统实现
        
3.4目录项对象
    VFS把目录当作文件对待, 所以在路径/bin/ls, bin和ls都属于文件。
    bin是特殊的目录文件, 而ls是一个普通文件, 路径中的每个组成部分都由一个索引节点对象表示。
    虽然它们可以统一由索引节点表示,但VFS经常需要执行目录相关的操作,比如路径名查找等。
    路径名超找需要解析路径中的每一个组成部分,不但要确定它有效,而且还需要进一步寻找路径中的下一个部分。
    为了方便查找, VFS引入目录项的概念。每个dentry代表路径中一个特定部分。对于/bin/ls来说, /、bin和ls都是目录项对象。
    前面是两个目录,最后一个是普通文件。在路径中,包括普通文件在内, 每一个部分都是目录项对象。
    解析一个路径是一个耗时的、常规的字符串比较过程。

    目录项对象由dentry结构体表示。
    目录项对象没有对应的磁盘数据结构,VFS根据字符串形式的路径名临时创建它。
    而且由于目录项对象并非真正保存在磁盘上,所以目录项结构体没有是否被修改的标志。
    
     a. 目录项状态:三种有效状态:被使用、未被使用和负状态
        一个被使用的目录项对应一个有效的索引节点(即d_inode指向相应的索引节点),并且表明该对象存在一个或多个使用者(即d_count为正值)。
        一个目录项处于被使用状态,意味着它正被VFS使用并且指向有效的索引节点,因此不能被丢弃。
        一个未被使用的目录项对应一个有效的索引节点(d_inode指向一个索引节点),但是应指明VFS当前并未使用它(d_count为0)。该目录项对象仍然指向一个有效对象,而且被保留在缓存中以便需要时再使用它。由于该目录项不会过早地被销毁,所以在以后再需要使用它时,不必重新创建,从而使路径查找更迅速。但如果要回收内存的话,可以销毁未使用的目录项。
        一个负状态的目录项没有对用的有效索引节点(d_inode为NULL),因为索引节点已被删除,或路径不再正确,但是目录项仍然保留,以便快速解析以后的路径查询。
        虽然负状态的目录项有些用处,但是如果需要的话,可以销毁它,因为毕竟在实际中很少用到它。目录项对象释放后也可以保存到slab对象缓存中去
     b. 目录项缓存
        如果VFS层遍历路径名中所有的元素,并将它们逐个地解析成目录项对象,这是非常耗时的工作。所以内核将目录项对象缓存在目录项缓存(即dcache)中。
        目录项缓存包括三个主要部分:
        (1)“被使用”目录项链表
            该链表通过索引节点对象中的i_dentry项链接相关的索引节点,因为一个给定的索引节点可能有多个链接,所以就可能有多个目录项对象,因此用一个链表来连接它们。
        (2)“最近被使用的”双向链表
            该链表含由未被使用的和负状态的目录项对象。由于该链表以时间顺序插入,所以链头的节点是最新数据。当内核必须通过删除节点项回收内存时,会从链尾删除节点项。
        (3)散列表和相应的散列函数用来快速将给定路径解析为相关目录项对象散列表由数组dentry_hashtable表示,其中每一个元素都是一个指向具体相同键值的目录项对象的指针。数组的大小取决于系统中物理内存的大小。
            实际的散列值由d_hash()函数计算,它是内核提供给文件系统唯一的散列函数。
查找散列表要通过d_lookup()函数,如果该函数在dcache中发现了与相匹配的目录项对象,则返回匹配的对象;否则返回NULL。
            dache在一定意义上也提供对索引节点的缓存。和目录项对象相关的索引节点不会被释放,因为目录项会让相关索引节点的使用计数为正,这样就可以确保索引节点留在内存中。只要目录项被缓存,其相应的索引节点也就被缓存了。
     c.目录项操作
        dentry_operations结构体指明了VFS操作目录项的所有方法。该结构体定义在
3.5文件对象
    文件对象表示进程已打开的文件。如果我们站在用户的角度考虑VFS,文件对象会首先进入我们的视野。
    进程直接处理的是文件,而不是超级块、索引节点或目录项。文件对象包含我们非常熟悉的信息(如访问模式、当前偏移等),同样道理,文件操作和我们非常熟悉的系统调用read()和write()等也很类似。
    文件对象是已打开的文件在内存中的表示。该对象(不是物理文件)由相应的open()系统调用创建,由close ()系统调用销毁,所有这些文件相关的调用实际上都是文件操作表中定义的方法。
    因为多个进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象。
    文件对象仅仅在进程观点上代表已打开文件,它反过来指向目录项对象(反过来指向索引节点),其实只有目录项对象才表示已打开的实际文件。虽然同一文件对应的文件对象不是唯一的,但对应的索引节点和目录项则是唯一的。
    文件对象由file结构体表示,定义在文件
    文件对象实际上没有对应的磁盘数据。所以结构体中没有代表其对象是否为脏,是否需要回写磁盘的标志。
    文件对象通过f_dentry指针指向相关的目录项对象。目录项会指向相关的索引节点,索引节点会记录文件是否脏的。

     文件操作:
     和file结构体相关的操作与系统调用很类似,这些操作是标准Unix系统调用的基础。
  文件对象的操作由file_operations结构体表示,定义在文件
    具体的文件系统可以为每一种操作做专门的实现,如果存在通用操作,也可以使用通用操作。
    一般在基于Unix的文件系统上,这些通用操作效果都不错。并不要求实际文件系统实现文件操作函
    数表中的所有方法,对不需要的操作可以将该函数指针设置为NULL

4. 与文件系统相关的数据结构    
     内核使用了另外一些标准数据结构来管理文件系统的其他相关数据结构。
     第一个结构体是file_system_type,用来描述各种特定文件系统类型,比如ext2和JFFS2。
     第二个结构体是vfsmount,用来描述一个安装文件系统的实例。
        因为Linux支持多种文件系统,所以内核必须由一个特殊的结构来描述每种文件系统的功能和行为,file_system_type结构体定义在
     每种文件系统,不管多少个实例安装到系统中,还是根本没有安装到系统中,都只有一个file_system_type结构。
     当文件系统被实际安装时,将有一个vfsmount结构体在安装点被创建。该结构体用来代表文件系统的实例,即代表一个安装点。
    理清文件系统和所有其他安装点间的关系,是维护所有安装点链表中最复杂的工作。所以vfsmount结构体中维护的各种链表就是为了能够跟踪这些关系信息。
    vfsmount结构还保存了在安装时指定的标志信息,该信息存储在mnt_flags域中。
   
5. 与进程相关的数据结构
    系统中的每一个进程都有自己的一组打开的文件,如根文件系统、当前工作目录、安装点等。
    有三个数据结构将VFS层和系统的进程紧密联系在一起,它们分别是:files_struct、fs_struct和namespace。
     a>. files_struct结构体
        由进程描述符中的files域指向。所有与每个进程相关的信息,如打开的文件及文件描述符都包含在其中。
     b>. fs_struct
        和进程相关的第二个结构体是fs_struct。该结构由进程描述符的fs域指向。它包含文件系统和进程相关的信息
     c>. namespace
        namespace结构体。其中的list域是链接已安装文件系统的双向链表,它包含的元素组成了全体命名空间。

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