麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

虛擬文件系統

2019-11-17 05:31:08
字體:
來源:轉載
供稿:網友

  Richard Gooch
翻譯:difeijing

本文檔中的慣例用法

==================
文檔中的每一節標題的右邊都有一個字符串"
"。
每個小節都會有個""在右邊。
這些字符串是為了在文檔中查詢更輕易而設的。

注重:本文檔的最新更新可在下面找到:
http://www.atnf.csiro.au/~rgooch/linux/docs/vfs.txt


它到底是什么?

=============
Virtual File System(或者被稱為Virtual Filesystem Switch)是Linux內核中的
一個軟件層,用于給用戶空間的程序提供文件系統接口。它也提供了內核中的一
個抽象功能,答應不同的文件系統共存。



它的工作方式的概覽

==================
在這一節里,在講解細節問題之前,我會簡單扼要的介紹一下VFS是如何工作的。
首先,介紹一下當用戶程序打開或者操作文件時發生了些什么,然后看看一個文
件系統是如何被支持的。

打開一個文件
------------
VFS實現了open(2)系統調用。路徑參數被VFS用來在目錄入口緩存(dentry cache
or "dcache")。這提供了一個將路徑名轉化為特定的dentry的一個快的查找機制。

一個單獨的dentry通常包含一個指向i節點(inode)的指針。i節點存在于磁盤驅動
器上,它可以是一個規則文件,目錄,FIFO文件,等等。Dentry存在于RAM中,并
且永遠不會被存到磁盤上:它們僅僅為了提高系統性能而存在。i節點存在于磁盤
上,當需要時被拷入內存中,之后對它的任何改變將被寫回磁盤。存在于RAM中的
i節點就是VFS的i節點,dentry所包含的指針指向的就是它。

dcache是你的整個文件空間的觀察點。跟Linus不同,我們中的大多數人不可能有
足夠的RAM空間來放我們的文件空間的所有文件的目錄入口緩存(dentry),所以我們
的dcache會有缺少的項。為了將路徑名轉換為一個dentry,VFS不得不采取創建dentry
的方式,并在創建dentry時將指針指向相應的i節點。這是通過對i節點的查找完成
的。

為了查找一個文件的i節點(通常從磁盤上讀),VFS需要調用該文件的父目錄的lookup()
方法,此方法是特定的文件系統所設置的。后面對此將會有更詳盡的描述。

一旦VFS得到了所需要的dentry(同時也得到了相應的i節點),我們就能夠對文件做想
要的操作:打開文件,或者用stat(2)來看i節點中的數據。stat(2)的操作非常簡單:
在VFS得到dentry之后,它取得inode中的一些數據并將其中的一部分送回用戶空間。
打開一個文件需要其它的操作:分配一個strUCt file(定義于linux/fs.h,這是內核中
的文件描述)結構。新分配的struct file結構被指向dentry的指針和對文件進行操作的
函數集合所初始化,這些都是從i節點中得到的。通過這種方式,特定的文件系統實現
才能起作用。

文件結構(struct file)被放在進程的文件描述符表中。

讀,寫和關閉文件(或者其它的VFS操作)是通過使用用戶空間的文件描述符找到相應的
文件結構(struct file),然后調用所需要的方法函數來實現的。

當文件處于打開狀態時,系統保持相應的dentry為"open"狀態(正在使用),這表示相應的
i節點在被使用。


注冊和安裝一個文件系統
----------------------
假如你想在內核中支持一種新的文件系統的話,你所需要做的僅僅是調用函數
register_filesystem().你向內核中傳遞一個描述文件系統實現的結構(struct filesystem
),
此結構將被加入到內核的支持文件系統表中去。你可以運行下面的命令:

% cat /PRoc/filesystems
這樣可以看到你的系統支持哪些文件系統。

當一個mount請求出現時,VFS將會為特定的文件系統調用相應的方法。安裝點的
dentry結構將會被改為指向新文件系統的根i節點。

現在是看看細節的時候了,nice to look!
struct file_system_type

=======================
此結構描述了文件系統。在內核2.1.99中,此結構的定義如下:
(注:在2.2的內核中,此結構也沒有變化)
struct file_system_type {
const char *name;
int fs_flags;
struct super_block *(*read_super) (struct super_block *, void *, int);
struct file_system_type * next;
};

其中各個域的意義:
name:文件系統的類型名稱,如"vfat","ext2",等等。
fs_flags:變量標志,如FS_REQUIRES_DEV, FS_NO_DCACHE,等等.
read_super:當此種文件系統的一個新的實例要被安裝時,此方法會被調用。
next:被內部的VFS實現所使用,你只需要將其初試化為NULL。

函數read_super具有以下的參數:
struct super_block *sb:超級塊結構。此結構的一部分被VFS初始化,余下的部分必須被
函數read_super初始化。
void * data:任意的安裝選項,通常是ASCII的字符串。
int silent:表示當出現錯誤時是否保持安靜。(不報警?)

read_super方法必須確定指定的塊設備是否包含了一個所支持的文件系統。當成功時返回
超級塊結構的指針,錯誤時返回NULL。

read_super方法填充進超級塊結構(struct super_block)的最有用的域是"s_op"域。這是
一個指向struct super_Operations的指針,此結構描述了文件系統實現的下一層細節。

struct super_operations

=======================
此結構描述了VFS對文件系統的超級塊所能進行的操作。
在內核2.1.99中,此結構的定義如下:
(注:在2.2的內核中,此結構已經有了改變)
struct super_operations {
void (*read_inode) (struct inode *);
void (*write_inode) (struct inode *);
void (*put_inode) (struct inode *);
void (*delete_inode) (struct inode *);
int (*notify_change) (struct dentry *, struct iattr *);
void (*put_super) (struct super_block *);
void (*write_super) (struct super_block *);
int (*statfs) (struct super_block *, struct statfs *, int);
int (*remount_fs) (struct super_block *, int *, char *);
void (*clear_inode) (struct inode *);
};

除非非凡提出,所有的方法都在未加鎖的情況下被調用,這意味著大多數方法都可以
安全的被阻塞。所有的方法都僅僅在進程空間被調用(例如,在中斷處理程序和底半
部中不能調用它們)

read_inode:從一個文件系統中讀取一個特定的i節點時調用此方法。i節點中的域"i_ino"
又VFS初始化為指向所讀的i節點,其余的域被此方法所填充。

write_inode:當VFS需要向磁盤上的一個i節點寫時調用。

put_inode:當VFS的i節點被從i節點緩沖池移走時被調用。此方法是可選的。

delete_inode:當VFS想刪除一個i節點時調用次方法。

notify_change:當VFS的i節點的屬性被改變時調用。若此域為NULL則VFS會調用write_inode
.
此方法調用時需要鎖住內核。

put_super:當VFS要釋放超級塊時調用(umount一個文件系統).此方法調用時需要鎖住內核。

write_super:當VFS超級塊需要被寫入磁盤時被調用。此方法為可選的。

statfs:當VFS需要得到文件系統的統計數據時調用。此方法調用時需要鎖住內核。

remount_fs:當文件系統被重新安裝時調用。此方法調用時需要鎖住內核。


clear_inode:當VFS清除i節點時調用。可選項。

以上方法中,read_inode需要填充"i_op"域,此域為一個指向struct inode_operations
結構的指針,它描述了能夠對一個單獨的i節點所能進行的操作。



struct inode_operations

=======================
此結構描述了VFS能夠對文件系統的一個i節點所能進行的操作。
在內核2.1.99中,此結構的定義如下:
(注:在2.2的內核中,此結構已經有了少許改變)
struct inode_operations {
struct file_operations * default_file_ops;
int (*create) (struct inode *,struct dentry *,int);
int (*lookup) (struct inode *,struct dentry *);
int (*link) (struct dentry *,struct inode *,struct dentry *);
int (*unlink) (struct inode *,struct dentry *);
int (*symlink) (struct inode *,struct dentry *,const char *);
int (*mkdir) (struct inode *,struct dentry *,int);
int (*rmdir) (struct inode *,struct dentry *);
int (*mknod) (struct

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品二区高清在线 | 中文字幕四区 | www亚洲成人| 主播粉嫩国产在线精品 | 国产成人精品一区二区视频免费 | 亚洲电影免费观看国语版 | 黄片毛片一级 | 天天夜碰日日摸日日澡性色av | 亚洲国产成人久久一区www妖精 | 久久蜜桃香蕉精品一区二区三区 | 成人h精品动漫一区二区三区 | 美国黄色毛片女人性生活片 | 国产成人av免费看 | 毛片在线免费观看完整版 | 天天躁狠狠躁夜躁2020挡不住 | 精品一区二区三区四区在线 | 99精品视频免费 | 蜜桃欧美性大片免费视频 | 亚洲视频观看 | 亚洲精华液久久含羞草 | 亚洲自拍第一 | 96视频在线免费观看 | 91精品观看91久久久久久国产 | 色戒在线版 | 欧美a级在线免费观看 | 一级在线观看 | 91网页视频入口在线观看 | 爱爱视频天天干 | 免费国产羞羞网站视频 | 天天色人人爱 | 免费看一级视频 | 久久精品亚洲精品国产欧美kt∨ | 日韩美香港a一级毛片免费 日韩激情 | 国产亚色 | 欧美国产一区二区三区激情无套 | 精品一区二区免费视频视频 | 久久千人斩 | 国产精品成人免费一区久久羞羞 | 国产精品区一区二区三区 | 免费观看三级毛片 | 日本高清在线免费 |