操作系统(第四版)第10章课件ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
d_op
系统打开文件表—链表
13
10.2 文件系统的注册与安装
Linux系统支持的所有文件系统在使用前必
须进行注册。 注册后,VFS就为内核提供了一个调用文件 系统方法的接口。 之后,再用mount命令将该文件系统安装到 根文件系统的某个目录结点上。
14
10.2.1 文件系统注册
通过两种方式实现注册: 在配制内核时选择要支持的文件系统,系统初始 化时,调用register_filesystem() 完成注册。 采用动态加载方式。在安装文件系统时,内核调 用register_filesystem() 完成注册,并在卸载时 完成注销。 注册步骤: 1. 为待注册的文件系统生成一个类型为 file_system_type的对象。 2. 调用register_filesystem() 完成注册。
文件的读写:read(), write()
19
5
Ext2 在内存的超级块结构ext2_sb_info
NTFS在内存的超级块结构ntfs_sb_info
6
10.1.3 文件对象
struct file { struct list_head f_list; 文件对象链表 struct dentry *f_dentry; 指向目录项对象 atomic_t f_count; 该对象的引用计数 loff_t f_pos; 文件的当前读写位置 struct file_operations *f_op; struct address_space *f_mapping; 映射 ……} 没有对应的磁盘映像。
7
10.1.4 目录项对象
struct dentry { atomic_t d_count; 引用计数 struct inode *d_inode; 指向文件的inode struct dentry *d_parent; 指向父目录项对象 struct list_head d_alias; 属于同一inode的 dentry链表 struct dentry_operations *d_op; 方法 ……} 没有对应的磁盘映像。
第10章 Linux 虚拟文件系统
北京理工大学计算机学院
1
VFS与具体文件系统的关系
Shell命令和应用程序 用户态 核心态
VFS
Minix
Ext2
UFS
FAT
NTFS
ቤተ መጻሕፍቲ ባይዱ
2
VFS
VFS的主要思想在于引入一个通用的文件模
型,该模型能够表示其支持的所有文件系统。 VFS所涉及的所有数据结构在系统运行时才 在内存建立,在磁盘上没有存储。
17
mount
mount(要安装的文件系统类型,块特别文件 路径名,要安装的目录路径名,文件系统的 安装标志); 块特别文件路径名是被安装的文件系统所在的 块设备文件路径名。 mount –t ntfs /dev/hda2 /mnt/ntfs
18
10.3 VFS系统调用的实现
文件打开与关闭:open(), close()
15
10.2.2 文件系统安装
要访问一个文件系统,必须将相应的文件
系统安装在系统目录树的一个目录下。 内核将安装点与被安装的文件系统信息保 存在vfsmount结构中。形成一个链式安装 表。
16
struct vfsmount { struct dentry *mnt_mountpoint; 指向安 装点的目录项对象 struct dentry *mnt_root; 指向被安装文件 系统的根目录 struct super_block *mnt_sb; 指向被安装 文件系统的超级块 ……}
9
10.1.5 与进程打开文件相关的数据结构
Struct tast_struct{ struct fs_struct *fs; 指向文件系统信息 struct files_struct *files; 指向进程打开 文件信息 …}
10
fs_struct
struct fs_struct { atomic_t count; 共享该结构的进程数 struct dentry *root, *pwd; 每个进程都有 自己的当前工作目录和根目录,通过这两个 目录与文件系统进行交互。 struct vfsmount *rootmnt; 根目录下安装 的文件系统对象 struct vfsmount *pwdmnt; 当前目录下安 装的文件系统对象 ……}
3
10.1 VFS的数据结构
超级块对象:Linux为每个安装好的文件系统
都建立一个超级块对象。 索引节点对象:打开的文件对应的…。 目录项对象:dentry (directory entry) 文件对象:记录了进程与打开的文件之间的交 互信息。
进程1 进程2 进程3 文件对象 文件对象 文件对象 目录项对象 目录项对象 索引节点 对象 超级块对象 磁盘文件
8
10.1.2 索引节点对象
struct inode { struct list_head i_sb_list; 同一超级块的索引 节点链表 unsigned long i_ino; 磁盘索引节点号 atomic_t i_count; 该对象的引用计数 nlink_t i_nlink; 硬链接计数 struct inode-operations *i_op; struct file_operations *i_fop; ……} 内嵌于ext2_inode_info结构。
4
10.1.1 超级块对象
struct super_block { struct list_head s_list; 系统超级块双向链 struct file_system_type *s_type; struct super_operations *s_op; struct dentry *s_root 根目录的目录项对象 struct list_head s_inode; 索引节点链表 struct list_head s_files; 文件对象链表 void *s_fs_info; 指向一个具体文件系统的超 级块结构 ……}
11
files_struct
struct files_struct { struct file **fd; 指向文件对象指针数组 struct file *fd_array[ ]; 文件对象指针数组 ……} 该数组包含32/64个文件对象指针,若不够用, 内核就分配一个更大的数组,地址放在fd字 段。 每个进程最多同时打开的文件数为1024个。
12
进程打开文件的过程
task_struct
fs files files_struct
fd_array[]
ext2_inode_info
i_data[15]
file
f_list f_dentry f_op f_pos f_count
dentry
d_inode
inode
i_ino i_fop
i_nlink