您的位置:首页 > 运维架构 > Linux

深入理解linux内核读书笔记(第十二章)

2015-07-31 16:58 183 查看
1. VFS是linux的一个专门来处理和文件系统相关的系统调用的软件层。

2. VFS支持的文件系统可分为三类:

(1) 基于磁盘的文件系统,ext2, ext3, vfat, ntfs, ISO9660, UDF, HFS等。

(2) 网络文件系统, nfs, cifs等

(3)特殊文件系统, proc等

3. VFS的思想是引入一种的通用的文件模型,它可以表示所有支持的文件系统。

4. 内核在打开文件后,会初始化对应文件系统的读写等指针。采用了面向对象的思想,用数据结构和函数指针来实现对象。

5. 通用的文件模型由以下几部分构成:

(1)超级快对象, 保存挂载的文件系统的相关信息。

(2)inode 对象,保存关于一个文件的信息。

(3)file 对象,保存进程和打开的文件之间的关联信息,只有打开文件后才存在于内核中。

(4)dentry对象,保存一个文件目录的信息。

6. 内核为了加速,有dentry cache和 inode cache。

7. 有些系统调用可以由VFS直接完成,而不需要调用下层的具体函数,比如close和lseek等。

8. super_block结构体中,s_list指向相邻超级快节点的,s_fs_info指向具体的超级快信息。这些信息是从磁盘中读取到内存,可以加速访问和修改。s_dirt用来表示是否需要去同步超级快到磁盘。

9. s_op(super_operations)保存了超级快操作的函数指针,包括alloc_inode,destroy_inode, read_inode, write_inode, delete_inode, put_inode, put_super, write_super, sync_fs, remount_fs 等操作。

10. inode 结构体中,i_state用来表示inode的状态,可能是需要与磁盘的inode进行同步的。

11. 每个inode都可能被链入三种类型的链表:

(1)未使用的inode, i_count 为0。

(2)使用中的inode, i_count 大于0。

(3)脏了的inode,链表指针保存在super_block中的s_dirty中(i_list)。

12. 每个inode 同时又被链入每个文件系统相关的双向链表中,保存在super_block中的s_inodes中(i_sb_list)。

13. 每个inode还被链入一个叫做inode_hashtable的哈希表中,当内核知道inode 号和超级块地址时,用来快速找到inode对象。对于冲突的inode,用链表进行解决,保存在i_hash中。

14. inode_operations,即i_op,保存了操作文件的方法,有create, lookup, link, unlink, mkdir, rmdir, rename, getattr, truncate, mknod等。

15. 一个文件系统中打开的文件对象保存在super_bolck中的s_files链表中。(f_list)

16. 当VFS打开文件时,默认将inode中的i_fop(file_operations)赋值给file对象的f_op,稍后,VFS可以重新给f_op赋值。

17. file_operations结构体包含read, write, llseek, ioctl, mmap, open, flush, release, fsync, lock等操作文件等方法。

18. 在查询一个文件名时, 内核为文件名路径中的没一部分都创建一个denty对象。

19. 每个dentry对象有四种可能的状态:

(1)free, VFS没有使用。

(2)unsed, d_count 为0, 但是d_inode仍然指向对应的inode,dentry是有效的,但是可能被回收。

(3)In use, d_count 大于0, d_inode指向对应的inode,这个dentry是不可以回收的。

(4)negative, d_inode 指向NULL, 表示inode被删除了或者是非法的文件名,dentry会留在缓存中,方便以后查询。

20. dentry_operations包含了d_revalidate, d_hash, d_compare, d_delete, d_release, d_iput函数。

21. dentry cache 包括两种数据结构:

(1)in use, unused 和 negative的dentry集合。

(2)一个哈希表,用来从一个目录中快速找到一个文件对应的dentry对象。

22. unuse dentry链表是以LRU 算法来组织的,最近释放的dentry被插入链表头部, 所以当denty cache 回收时, 位于末尾的将被释放。

23. 每个进程都有当前目录和root目录,这些信息保存在fs_struct结构体中。进程打开的所有文件信息,保存在files_struct 结构体中。

24. files_struct中,进程打开的文件对象指针保存在fd指针数组中,fd默认初始化为fd_array,大小为32, 当打开的文件大于32时,内核重新分配数组,更新fd。

25. file_system_type结构体用来表示一个文件系统类型信息,所有的文件系统用单链表链起来。get_sb 用来创建一个超级块并且初始化。最后通过调用register_filesystem来进行注册。

26. 挂载上的文件系统的有关信息用vfsmount 结构体来表示。

27. path_lookup函数用来通过文件名找到一个文件的inode,最终填充nameidata结构体,增加其中dentry和vfsmount的引用计数,最后用户需要调用path_release来释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: