vfs-文件系统基础

超级块对象

super_block->s_inodes 表示所有的inode。

super_block->s_dirty 表示脏的inode。

super_block->s_io 表示等待被写入磁盘inode。

super_block->s_fs_info 指向特定超级块信息的指针

super_block->s_op表示超级块的方法

inode会复制磁盘索引节点的包含的一些数据

inode->i_hash 用于散列链表的指针(索引节点会被存放在一个inode_hashtable散列表中)

inode->i_list用于描述索引节点当前状态的链表指针

放在下列链表之一

有效未使用的索引节点链表(镜像有效的索引节点未被进程使用)

正在使用的索引节点链表(镜像有效的索引节点且被进程使用)

脏索引节点的链表(链表中的首元素和尾元素由相应的超级块对象s_dirty引用)

inode->i_sb_list 超级块索引节点的链表的指针(超级块会链接所有对应的inode)

inode->i_dentry 引用索引节点的目录项对象的链表头

inode->i_ino 索引节点号

inode->i_count 引用此索引节点的计数器

inode->i_op 索引节点的操作函数集包括创建删除等操作

inode->i_fop 缺省的文件操作函数

inode->i_sb 指向超级块对象的指针

目录项对象

dentry->d_hash 用于散列链表指针

dentry->d_lru 未使用的链表指针

dentry->d_subdirs 对目录而言子目录项链表的头

dentry->d_alias 用于对同一索引节点相关的目录项链表指针

dentry->d_inode 目录项关联的索引节点

dentry->d_op 目录项方法(名称散列函数、比较两个文件名称、释放目录项函数)

目录项对象在磁盘上没有对应的镜像

一个处于正在使用、未使用、负状态的目录项对象的集合

一个散列表,能够快速的根据名称找到对应的目录项,如果对象不存在返回空值

所有未使用的目录项都保存在lru双向链表中,存放在dentry_unused

正在使用的dentry插入到inode->i_dentry链表

当目录项变成负状态的dentry会被加入到lru里去(dentry_hashtable)。

进程描述符的fs_struct fs

fs->count 共享这个表的进程个数

fs->root根目录的目录项

fs->pwd 当前工作目录目录项

fs->altroot模拟根目录的目录项

fs->rootmnt 根目录所安装的文件系统对象

fs->pwdmnt 当前目录所安装的文件系统对象

fs->altrootmnt 模拟根目录所安装的文件系统对象

进程描述符的files_struct files

files->count 引用该表的进程数目

files->max_fds 文件对象的当前最大数目

files->max_fdset 文件描述符的当前最大数目(存放位图的位数)

files->next_fd 分配的最大文件描述符+1

files->fd 文件对象指针的数组指针

files->fd_array 文件对象指针初始化数组

files->close_on_exec指向执行exec需要关闭的文件描述符的指针

files->open_fds指向打开文件描述符的指针

files->close_on_exec_init 执行exec时需要关闭的文件描述符初始集合

files->open_fds_init 文件描述符的初始集合(当前已经打开文件的文件描述符位图)

每个注册的文件系统使用类型为file_system_type对象表示

所有的文件系统类型都插入到一个单向的链表中file_systems作为表头

file_system_type->name 文件系统名称

file_system_type->fs_flags文件系统类型标志

file_system_type->get_sb读超级块的方法

file_system_type->kill_sb删除超级块的方法

file_system_type->next 指向文件系统类型链表的下一个元素

file_system_type->fs_supers具有相同文件系统类型的超级块对象链表头

get_fs_type()扫描已注册的文件系统链表以查询文件系统类型的name字段并返回file_system_type对象

task_struct结构体里的 struct namespace变量

namespace->count引用计数

namespace->root命名空间根目录已安装文件系统描述符

namesapce->list 所有属于此命名空间已安装文件系统描述符链表的头

namespace->sem 保护此数据结构的读写信号量

已安装文件系统描述符vfsmount

vfsmount->mnt_hash 用于散列链表的指针

vfsmount->mnt_parent 指向父文件系统(覆盖目录的文件系统)

vfsmount->mnt_mountpoint 指向文件系统安装点目录的dentry

vfsmount->mnt_root 指向这个文件系统的根目录dentry

vfsmount->mnt_sb 指向这个文件系统的超级块对象

vfsmount->mnt_mounts 包含所有文件系统描述符链表的头(这个文件系统的子文件系统)

vfsmount->mnt_child用于已安装文件系统的链表的指针

vfsmount->mnt_count 引用计数器

vfsmount->mnt_flag 标志

vfsmount->mnt_expiry_mark 为true标志文件系统到期。设置了此标记且引用计数为0则会自动卸载此文件系统

vfsmount->mnt_devname 设备名称

vfsmount->mnt_fslink 具体文件系统到期的链表指针

vfsmount->mnt_namespace 指向安装了文件系统的进程命名空间的指针

由父文件系统描述符地址和安装点目录的目录项对象的地址作为索引散列表中,散列表存放在mount_hashtable。

对于每个命名空间属于此命名空间的已安装文件系统被放在namespace->list

所有已安装文件系统放在vfsmount->mnt_mounts

alloc_vfsmnt(const char *name)分配和初始化一个已安装文件系统描述符

free_vfsmnt(struct vfsmount *mnt) 释放由mnt指向的已安装文件系统描述符

lookup_mnt(struct vfsmount *mnt, struct dentry *dentry)在根据父文件系统的地址和安装点目录项地址在散列表查找vfsmnt

安装rootfs

1、init_rootfs 主要是注册 rootfs文件系统,register_filesystem(&rootfs_fs_type)

2、init_mount_tree :主要是初始化namespace以及初始化mnt和init_task的以及其子线程的namespace

页高速缓存

1、address_space对象被inode->i_mapping指向,如果所有者是个文件则inode->i_data指向address_space

2、address_space->host指向这个inode

address_space->radix_tree_root

struct radix_tree_root {

unsigned int height;//树的当前深度

int gfp_mask;//分配内存标志

struct radix_tree_node *rnode;//指向树中第一层节点

};

struct radix_tree_node {

unsigned int count;//非空指针数量的计数器

void *slots[RADIX_TREE_MAP_SIZE];//保存指向页描述符的指针

unsigned long tags[RADIX_TREE_TAGS][RADIX_TREE_TAG_LONGS];//二维标志数组

};

find_get_page根据address_space和index索引值搜索指定的页描述符,找到返回也描述符地址找不到返回NULL.,此函数会增加页描述符使用计数。

此函数依赖radix_tree_lookup函数进行搜索。radix_tree_lookup函数会在深度范围内搜索。

find_lock_page函数与find_get_page非常类似只是其会额外设置page的PG_locked标志,即以互斥访问页描述符对应的页。此函数使用了lock_page函数,lock_page会等待标志位释放且用uninterruptiable等待,当内核其他路径使用unlock_page函数对页面进行解锁的时候会唤醒等待队列上的睡眠进程。

find_trylock_page与find_lock_page类似但是不会阻塞,如果请求不到锁则出错返回。

add_to_page_cache函数是插入到指定索引值并且根据需要会建立相应的node。

remove_from_page_cache从address_space删除指定的page,由于page里存储了address_space和index,所以此函数只接收一个参数

read_cache_page:读取页并且更新,如果页不存在则分配并插入到address_sapce

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值