国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

虛擬文件系統 (VFS) 簡介

2024-07-21 02:37:49
字體:
來源:轉載
供稿:網友

  前言
  
  linux是目前蠻熱門的一個操作系統。很多人都知道它很是免費的,而且它也很穩定,更重要的是,它不會出現藍色畫面。可是,你知道嗎? Linux所支持的檔案系統高達十幾個,除了為它量身打造的Ext2之外,它還支持了Minix,FAT,VFAT,NFS,NTFS…等等。 有沒有想過,它是怎么做到使得可以同時支持十多個檔案系統呢? 沒錯,就是VFS,也就是這篇文章的重點。在這篇文章里,我會跟各位介紹Linux檔案系統的結構,VFS所扮演的角色。
  
  Linux檔案系統結構
  圖:http://linuxfab.cx/Columns/17/Image2.gif
  Linux的檔案系統在外型上其實跟UNIX檔案系統是一樣的。它是一個反轉過來的樹。最上層是系統的根目錄,也就是"/"。系統根目錄底下可以是目錄也可以是檔案,目錄里也可以包含目錄,檔案等。如此就形成一個反轉過來的樹。我們知道,在Windows,假如你有二個partition,一個叫C,另一個叫D。當你要到D這個partition時,只要打"D:"就可以了。但是在Linux里可不是這樣。要去讀取另一個partition的資料必須要經由mount的動作。像
  
  mount -t ext2 /dev/hda3 /mnt
  
  就會將硬盤第三個partition掛在/mnt這個目錄底下。Mount完之后,/mnt原本的內容會看不到,只會看到hda3里的內容。其中/mnt我們稱為hda3的mount point。而/mnt這個目錄則是被hda3所cover。經過mount以后,我們就可以經由/mnt去讀取hda3的內容,就好象hda3的內容本來就放在/mnt底下一樣。整個過程,如圖1所示。
  
  圖1(a)是原本的檔案結構,圖1(b)則是hda3這個partition的內容,將hda3 mount到/mnt之后,整個檔案系統就變成圖1(c)的樣子。不管如何,Linux會保持其檔案系統為一個tree的外形。這樣mount下去,我們很輕易可以推想到,從根目錄開始的這個tree很有可能包含好幾種的檔案系統,可能掛在/mnt上的是Ext2檔案系統,掛在/home上的是FAT,而掛在/cdrom上的則是iso9660檔案系統。我們知道,當使用者去讀取這些目錄里的內容時,他本身是不用去管這個目錄掛的檔案系統是什么。基本,使用者也不會感到有什么不同。而就PRogrammer的觀點來看,我們也不會說去讀/mnt里的檔案和去讀/home里的檔案要下不同的參數。Linux是怎么做到這一點的呢? 它就是利用VFS來做到的。
  
  1. VFS架構
  
  Linux檔案系統其實可以分為三個部分,第一部分叫Virtual File System Switch,簡稱VFS。這是Linux檔案系統對外的接口。任何要使用檔案系統的程序都必須經由這層接口來使用它。另外二部分是屬于檔案系統的內部。其中一個是cache,另一個就是真正最底層的檔案系統,像Ext2,VFAT之類的東西,整個Linux檔案系統可以用圖2來表示
  
  為了避免困擾,底下我們所講的檔案系統都是指Ext2,FAT等底層的檔案系統,至于包含VFS,Ext2,Buffer Cache等等我們總稱為VFS。
  
  在圖2里,我們可以清楚的看到當Kernel要使用檔案系統時,都是經由VFS這層接口來使用。剛才我們有提到一個問題,就是當使用者或程序設計師去讀取一個檔案的內容時,它不會因為這個檔案位于不同的檔案系統就需要使用不同的方式來讀取。因為這件事VFS已經幫我們做了。當我們要讀取的檔案位于CDROM時,VFS就自動幫我們把這個讀取的要求交由iso9660檔案系統來做,當我們要讀取的檔案在FAT里時,VFS則自動呼叫FAT的函式來幫我們做到。當然,有需要時,VFS也會直接透過Disk driver去讀取資料。但是當我們要求讀寫檔案時,難道iso9660或FAT檔案系統會直接透過driver去讀寫嗎? 不是的。就像PC上除了內存之外,還有一層的cache來加快速度,在Linux檔案系統其實也是有一個Cache的機制以加快速度。叫做Buffer Cache。底層的檔案系統要讀寫磁盤上的資料時都要經過Buffer Cache。假如資料在Buffer Cache里有的話,就直接讀取,假如沒有的話,才透過Buffer Cache要求driver去讀寫。除了Buffer Cache之外,其實,Linux檔案系統里還有一個Cache,叫Directory Cache。你知道嗎? 假如我們去統計使用者的行為的話,ls這種命令其實占的比重是蠻大的。每次的ls或讀寫檔案其實都要對目錄的內容做search。因此,假如在目錄這方面能做個Cache的話,那系統整統的速度就會再往上提升。Directory Cache的功能就在此。其實,Linux檔案系統里還有一個Cache,叫Inode Cache。故名思義,它是針對Inode做的Cache。Directory Cache跟Inode Cache其實關系是很密切的。
  
  
  2. 檔案的表示
  
  從使用者的觀點來看,我們可以用檔案的絕對路徑來代表某個檔案而不會出錯。在VFS里,它并不是用路徑來代表檔案的。它是用一個叫Inode的東西來代表的。基本上,檔案系統里的每一個檔案,系統都會給它一個Inode,只要Inode不一樣,就表示這二個檔案不是同一個,假如兩個的Inode一樣,就表示它們是同一個檔案。其實,Inode是VFS所定義的,而我們知道VFS里包含了好幾種的檔案系統,并不是每一個檔案系統都會有Inode的這種概念。
就像FAT,事實上它跟本沒有所的Inode概念。但是當VFS要求FAT去讀取某個檔案時,事實上它是把那個檔案的Inode傳給FAT去讀。所以,在VFS來講,每一個檔案都有其對應的Inode,但是在底層的檔案系統不見得是這種情形。因此,VFS跟底層的檔案系統溝通也是經過一層的接口。比方說,VFS要open一個位于FAT的檔案時,VFS會配置一個Inode,并把這個Inode傳給FAT,FAT要負責填入一些資料到Inode里,必要時,也可以在Inode里加入自己所需要的資料。再打個比方,VFS要讀取FAT里檔案的內容,反正VFS就是把Inode給FAT,并且告訴它從那里開始讀,讀多少個byte。其余的就是FAT的事,它就要想辦法讀出來。用"上有政策,下有對策"這句話來描述VFS跟底層的檔案系統的互動可能還蠻適合的。VFS的政策就是要以Inode為單位,但是底層的檔案系統還是照自己的方式去存放檔案,只要表面上將Inode填好,VFS要的東西給他就行了。
  
  在VFS里,Inode是檔案的單位,那檔案系統呢? 在VFS里底層的檔案系統又是用什么來表示呢? 要講這個之前,我們先來講講硬盤的layout。
  
  
  3. Disk的Layout
  圖:http://linuxfab.cx/Columns/17/Image3.gif
  
  在這里所講的disk是指硬盤,有關于floopy disk則不討論。我們知道一顆硬盤最多可以有8個partition,其中4個是primary partition,另4個則是extended partition。所謂partition就是在邏輯上將disk做切割。所以,我們可以把一顆硬盤想象成是由最多8個partition所組成的。除了partition之外,disk的第一個扇區我們稱為MBR。如圖3所示
  http://linuxfab.cx/Columns/17/Image4.gif
  
  在Linux里,檔案放的位置是以一個partition為單位的,也就是說一個檔案系統是放在partition里,而不能跨partition的。接下來讓我們來看看檔案系統在partition里的layout是怎么樣的,如圖4所示。
  
  基本上,第一個block是boot block。用來開機用的。Super block則記錄了檔案系統重要的資料,接下來的東西就是記錄著inode和資料的區塊。
  
  在VFS里,每一個檔案系統是由其super block來表示的。之所以這樣,是因為super block里存放了這個檔案系統重要信息。從一個檔案系統的super block就可以存取這個檔案系統中的任何檔案。因此,在Linux里,檔案系統的治理以super block為單位,從super block可以取得這個檔案系統里任何一個檔案的inode,從檔案的inode則可以對這個檔案做讀寫的動作,進而完成對Linux底下檔案的控制。因此,Kernel分別定義了一個super_block和inode的結構來描述檔案系統的super block和及inode。底下我們就分別來介紹super block和inode的結構。
  
  Super block結構
  
  super_block結構定義在里,整個結構可分為基本資料,一組用來使用super block結構的函式,一組跟quota治理有關的函式,治理super block所屬檔案系統inode的信息,一些字段用來做super block的synchronization,以及各個檔案系統本身所特有的資料。
  
  4. 基本資料
  strUCt list_heads s_list;
  kdev_t s_dev;
  unsigned long s_blocksize;
  unsigned char s_blocksize_bits;
  unsigned char s_rd_only;
  unsigned char s_dirt;
  struct file_system_type *s_type;
  unsigned long s_flags;
  unsigned long s_magic;
  unsigned long s_time;
  struct dentry *s_root;
   
  以上這些字段是我認為super_block結構里屬于基本資料的部分,在這里,我沒有依照原始程序的寫法依序將字段列出來,而是將相關的整理在一起。s_list這個字段是用來將super block串在一起的。在Linux里,同一時間Kernel可能會擁有好幾個檔案系統的super block,因此,它有它自己一套的super block治理方式,平常也許我們會另外寫一個linked list,里面用一個字段存放super block,用這種方式把super block串在一起,但是,Kernel不是這樣做,它也是用一個串行來把super block放在一起。但是,它把它寫到super block結構里,s_list就是用來將super block串起來的。用法跟一般人寫法不同,在super block的治理我將為各位介紹。
  
  s_dev是此super block所屬檔案系統所在的device代碼。檔案系統內部的治理不是用檔案做單位,而是以block為存取的單位,而s_blocksize就是用來記錄一個block是幾個byte。因此,假如一個block是1024 byte的話,那s_blocksize為1024,而s_blocksize_bits就是10,這個字段是指一個block需要幾個bit來表示。而s_rd_only從字面上來看應該是記錄檔案系統或super block是否只讀,目前這個字段是被設為0,還沒有被使用。至于s_dirt則是記錄此super block的內容是否被改過,用來判定是否最后要將super block寫回disk里,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 如东县| 安西县| 桐城市| 砀山县| 沛县| 平阴县| 徐闻县| 会同县| 荣昌县| 景宁| 额尔古纳市| 潢川县| 贵定县| 泸水县| 玛曲县| 淮北市| 偏关县| 房山区| 孟州市| 体育| 西华县| 成都市| 辽阳县| 桦甸市| 商水县| 洪湖市| 交口县| 杨浦区| 邵阳县| 东辽县| 石景山区| 库尔勒市| 锡林郭勒盟| 红河县| 宣威市| 洞头县| 阳春市| 玛多县| 耿马| 柳江县| 都昌县|