Embed
Email

Linux ???????

Document Sample
Linux ???????
Shared by: HC111213075812
Categories
Tags
Stats
views:
0
posted:
12/13/2011
language:
pages:
40
Linux内核源代码导读

中国科学技术大学计算机系

陈香兰(0551-3606864)

xlanchen@ustc.edu.cn

Spring 2009

Linux的虚拟文件系统

提纲



虚拟文件系统VFS的作用

VFS的数据结构

文件系统类型

文件系统安装

路径名查找

VFS系统调用的实现

文件加锁







2011-12-13 Linux操作系统源代码导读 3/31

虚拟文件系统VFS的作用



虚拟文件系统

 Virtual Filesystem

 Virtual Filesystem Switch

 VFS是一个软件层,用来处理与Unix标准文件系统相

关的所有系统调用。

 是用户应用程序与文件系统实现之间的抽象层

 能为各种文件系统提供一个通用的、统一的接口

Linux与其他类Unix系统一样,采用虚拟文件系

统VFS来达到支持多种文件系统格式的目标





2011-12-13 Linux操作系统源代码导读 4/31

VFS在一个简单文件复制操作中的作用



假设用户输入以下shell命令

$ cp /floppy/TEST /tmp/test

其中,

 /floppy是MS-DOS的磁盘的一个挂载点(安装点)

 /tmp是Ext2文件系统中的一个目录

对于cp命令而言,它不需要知道/floppy/TEST和

/tmp/test分别是什么文件系统类型

 在cp命令中,它通过VFS提供的系统调用接口进行文

件操作





2011-12-13 Linux操作系统源代码导读 5/31

2011-12-13 Linux操作系统源代码导读 6/31

VFS支持的文件系统类型



 VFS支持的文件系统可以划分为三种主要类型

 基于磁盘的文件系统:它们管理在本地磁盘分区中可用的存储

空间

 Linux使用的文件系统:ext2、ext3、ReiserFS

 Unix家族的文件系统:SYSV文件系统,UFS,MINIX文件系统以

及VERITAS VxFS

 微软公司的文件系统:MS-DOS、VFAT以及NTFS

 ISO9660CD-ROM文件系统和通用磁盘格式的DVD文件系统

 其他有专利权的文件系统,如HPFS、HFS、AFFS、ADFS

 起源于非Linux系统的其他日志文件系统,JFS,XFS









2011-12-13 Linux操作系统源代码导读 7/31

 网络文件系统:用于访问属于其他网络计算机的文件系统所包

含的文件

 NFS、Coda、AFS、SMB、NCP

 特殊文件系统

 不同于上述两大类

 不管理具体的磁盘空间

 /proc

 各种不同的文件系统通过mount(挂载、安装)到根文

件系统中

 在Linux中,根文件系统即根目录所代表的文件系统

 通常是ext2文件系统









2011-12-13 Linux操作系统源代码导读 8/31

VFS中通用文件模型概念



VFS的基本思想:引入一个通用文件模型,这个

模型能够表示所有支持的文件系统

 对于一个具体实现的文件系统,在处理时,需要将其

进行概念上的转换

 例如,在通用文件模型中,目录被看成是普通文件

 在实现上,

read()sys_readfile数据结构f_opMS_DOS文件操作指

针(其中的read操作)

 类似面向对象的概念









2011-12-13 Linux操作系统源代码导读 9/31

sys_read(unsigned int fd, char __user * buf, size_t count)





vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)





file->f_op->read(file, buf, count, pos);









例如:字符设备:filp->f_op = fops_get(p->ops);









2011-12-13 Linux操作系统源代码导读 10/31

通用文件模型有下列对象类型组成

 超级块对象(superblock object)

 存放文件系统相关信息:例如文件系统控制块

 索引节点对象(inode object)

 存放具体文件的一般信息:文件控制块/inode

 文件对象(file object)

 存放已打开的文件和进程之间交互的信息

 目录项对象(dentry object)

 存放目录项与文件的链接信息









2011-12-13 Linux操作系统源代码导读 11/31

三个不同的进程打开同一个文件









同一个

硬链接









两个不同的硬链接





2011-12-13 Linux操作系统源代码导读 12/31

VFS所处理的系统调用



 mount、umount:挂载/卸载文件系统

 sysfs :获取文件系统信息

 statfs、fstatfs、ustat :获取文件系统统计信息

 chroot :更改根目录

 chdir、fchdir、getcwd :操纵当前工作目录

 mkdir、rmdir :创建/删除目录

 getdents、readdir 、link 、unlink 、rename :对目录项进行操作

 readlink 、symlink :对符号链接进行操作

 chown 、fchown 、lchown :更改文件所有者

 chmod 、fchmod 、utime :更改文件属性

 open、close、create …









2011-12-13 Linux操作系统源代码导读 13/31

上述大部分操作之需要与通用文件模型中的一些

对象打交道,而不需要真正操作具体的文件系统

和文件,因此可以把VFS看成是一个“通用”的文

件系统,在必要时依赖某种具体的文件系统









2011-12-13 Linux操作系统源代码导读 14/31

VFS的数据结构



每个VFS对象都对应一定的数据结构,在这个数

据结构中包含对象的属性及其方法



一个具体的文件系统:超级块对象:super_block

 所有超级块链表:super_blocks :s_list域

 文件系统特有信息:s_fs_info域

 脏标志:s_dirt域

 文件系统特有方法:super_operations数据结构及域







2011-12-13 Linux操作系统源代码导读 15/31

一个具体的文件:Inode对象:inode

 Inode特有的方法





一个打开文件:文件对象:file

 文件操作指针f_pos

 文件对象特有的方法



 专用高速缓存:flip,filp_cachep





目录项对象:dentry

2011-12-13 Linux操作系统源代码导读 16/31

与进程相关的文件



文件系统相关信息fs_struct

打开文件相关信息files_struct









2011-12-13 Linux操作系统源代码导读 17/31

2011-12-13 Linux操作系统源代码导读 18/31

2011-12-13 Linux操作系统源代码导读 19/31

文件系统类型



特殊文件系统

 用来为系统程序员、系统管理员等提供一种容易的方

式来操作内核的数据结构并实现操作系统的特殊特征

 常用的特殊文件系统









2011-12-13 Linux操作系统源代码导读 20/31

2011-12-13 Linux操作系统源代码导读 21/31

文件系统类型的注册



文件系统类型:file_system_type







在系统初始化期间,register_filesystem()用来注

册编译时指定的每个文件系统

 相应的文件系统对象被插入到file_systems链表中

unregister_filesystem()









2011-12-13 Linux操作系统源代码导读 22/31

文件系统的挂载



根文件系统

 在系统初始化过程中被直接mount

 提供系统初始化脚本以及基本命令

每个文件系统都有自己的根目录

如果一个文件系统的根目录是系统目录树的根目

录,那个这个文件系统就是根文件系统

其他文件系统可以挂载到系统的目录树上

 这样的目录称为挂载点(mount点,安装点)

文件系统之间的挂载关系对应文件系统之间的父

子关系

2011-12-13 Linux操作系统源代码导读 23/31

例如,放在软盘/dev/fd0上的ext2文件系统,可

通过下列命令安装在/flp上

mount -t ext2 /dev/fd0 /flp

一般情况下,只允许挂载一次

在umount之前,其他对/dev/fd0的挂载命令会失



在2.4中,可以挂载多次

 不管被挂载多少次,只有一个真实的文件系统,因此

只有一个超级块对象





2011-12-13 Linux操作系统源代码导读 24/31

已挂载文件系统描述符vfsmount



挂载根文件系统

 第一阶段:安装一个特殊的文件系统,该文件系统仅

提供一个作为初始安装点的空目录:init_mount_tree

 第二阶段:mount_root

挂载一个文件系统

 sys_mount

卸载一个文件系统

 sys_umount

2011-12-13 Linux操作系统源代码导读 25/31

从mount操作到get_sb的过程

sys_mount(char __user * dev_name, char __user * dir_name,

char __user * type, unsigned long flags,

void __user * data)



do_mount(char *dev_name, char *dir_name, char *type_page,

unsigned long flags, void *data_page)



do_new_mount(struct nameidata *nd, char *type, int flags,

int mnt_flags, char *name, void *data)





do_kern_mount(const char *fstype, int flags, const char *name, void *data)



vfs_kern_mount(struct file_system_type *type, int flags,

const char *name, void *data)







2011-12-13 Linux操作系统源代码导读 26/31

路径名查找



VFS是如何从文件路径名找到相应的索引节点的



 分析路径名,将它拆分成一个文件名序列

 除了最后一个文件名之外,其他所有文件名必定都是

目录名





搜索的起点:

 绝对路径:currentfsroot

 相对路径:currentfspwd





2011-12-13 Linux操作系统源代码导读 27/31

首先找到起点目录的索引节点

在这个索引节点的目录文件中,找到第一个目录

名(文件名)所对应的索引节点

在第一个目录名的索引节点的目录文件中找到第

二个目录名(文件名)所对应的索引节点

…反复,直到文件名序列的最后一项









2011-12-13 Linux操作系统源代码导读 28/31

在上述查找过程中要处理的其他问题:

 对每个目录的访问权限必须进行检查

 若是符号链接,需要进行扩展

 要考虑符号链接的循环引用(进行处理)

 目录名可能是一个文件系统的安装点,必须扩展到一

个新的文件系统中



路径名查找

 数据结构:struct nameidata







2011-12-13 Linux操作系统源代码导读 29/31

路径名查找过程



path_lookup_open path_lookup_create





__path_lookup_intent_open



do_path_lookup





path_walk



link_path_walk



__link_path_walk





do_lookup



2011-12-13 Linux操作系统源代码导读 30/31

查找操作的标志









2011-12-13 Linux操作系统源代码导读 31/31

标准查找操作



要处理的问题

 跳过第一个路径名分量前的任何/

 考虑符号链接的查找

 检查权限

 考虑“.”

 考虑“..”

 考虑普通目录,要在目录项高速缓存中查找

…









2011-12-13 Linux操作系统源代码导读 32/31

父路径名的查找



在很多情况下,查找操作的真正目的不是路径名

的最后一个分量,而是最后分量的前一个分量

 例如创建一个文件时

 此时,路径解析的结果中存放最后一个分量所在目录

对应的对象









2011-12-13 Linux操作系统源代码导读 33/31

符号链接的查找



关于符号链接的解析由内核来完成



如何识别这是一个符号链接?

如何处理符号链接的循环情况?









2011-12-13 Linux操作系统源代码导读 34/31

VFS系统调用的实现



 仍然考虑

$ cp /floppy/TEST /tmp/test

 假定cp执行下列代码片段(实际要更复杂)

 inf = open("/floppy/TEST", O_RDONLY, 0);

outf = open("/tmp/test", O_WRONLY | O_CREAT | O_TRUNC,

0600);

do {

len = read(inf, buf, 4096);

write(outf, buf, len);

} while (len);

close(outf);

close(inf);









2011-12-13 Linux操作系统源代码导读 35/31

open()系统调用

 sys_open

read和write系统调用

 sys_write

 sys_read

close系统调用

 sys_close









2011-12-13 Linux操作系统源代码导读 36/31

打开一个文件:f_op的设置



sys_open(const char __user *filename, int flags, int mode)



do_sys_open(int dfd, const char __user *filename, int flags, int mode)



do_filp_open(int dfd, const char *pathname,

int open_flag, int mode)





path_lookup_open或

nameidata_to_filp(struct nameidata *nd, int flags)

path_lookup_create





__dentry_open中:









2011-12-13 Linux操作系统源代码导读 37/31

上述几个数据结构之间的关系:



Linux内核支持哪些文件系统类型?取决于

 register_filesystem,注册文件系统类型

 提供具体的文件系统类型的定义,如romfs,ramfs,ext2fs等

 其中包含一个get_sb方法

加载一个具体的文件系统时(mount)

 调用get_sb填写文件系统的超级块,包括填写超级块

方法

打开一个文件时

 确定目录项;确定inode(及文件方法);初始化file

结构等





2011-12-13 Linux操作系统源代码导读 38/31

Project



分析一个具体的文件系统类型的实现,并分析它

如何能通过VFS加入到Linux系统中

 例如romfs;ramfs;ext2;ext3等等

并做如下实验:

 使用静态编译或者动态加载的方法,使得你使用的

Linux内核支持你分析的文件系统类型

 在你的Linux环境中创建一个文件系统映像

 将你创建的文件系统映像mount到你的Linux环境中

 在你创建的文件系统中进行读写





2011-12-13 Linux操作系统源代码导读 39/31

Thanks!

The end.


Other docs by HC111213075812
Red Socks and Yellow Socks
Views: 10  |  Downloads: 0
ESCUELA SUPERIOR POLITECNICA DEL LITORAL
Views: 1  |  Downloads: 0
Resume
Views: 1  |  Downloads: 0
1-
Views: 0  |  Downloads: 0
Introduction
Views: 0  |  Downloads: 0
PVS Licence
Views: 1  |  Downloads: 0
Haurrentzako diskoak
Views: 22  |  Downloads: 0
La repentance corporative
Views: 0  |  Downloads: 0
REPUBLIQUE FRAN�AISE
Views: 0  |  Downloads: 0
Technology, Modernisation & Industrialisation
Views: 0  |  Downloads: 0
By registering with docstoc.com you agree to our
privacy policy

You are almost ready to download!

You are almost ready to download!