Linux核心大講堂 (三) 督脈之虛擬檔案系統(1)

來源:互聯網
上載者:User

Linux核心大講堂 (三)
督脈之虛擬檔案系統(1)

在上一節<<Linux核心大講堂 (二)
傳說中的字元裝置(4)>>中我們略微跟了一下檔案系統相關的代碼,雖然跟的不多,但是總算和虛擬檔案系統和ext3打了個招呼。接下來就要專門講檔案系統了。檔案系統也是分層的,簡單來說分兩大層。上層是虛擬檔案系統,顯然下層就是非虛擬檔案系統了,就是“實際”的檔案系統。什麼才算實際?呵呵。高中學過反證法,這時候你就感謝那些比我們起的都早,睡覺比我們都晚的高中老師吧。大學老師嘛,我就不說你們了,做生意的做生意去,騙項目經費的就騙項目經費去,該幹嘛幹嘛去,和老子無關。

我們高中老師教會我們要有逆向思維,這些老師如果會玩核心,再教學生,我想大家就不會感覺虛擬檔案系統這麼難了,最少偉大的高中老師可以把虛擬檔案系統和“實際檔案系統”講的很清楚。高中老師呢,我是請不來了,大家就勉為其難聽我講一下算了。

我們先把虛擬搞清楚,實際的意義就水落石出了。虛擬在我看有兩層含義,首先我們看一看C++的關鍵字vitural,不用我多說,實現繼承的一種重要手段。Linux是用C寫的,沒法用vitural,所以把共性抽出來讓上層的實際檔案系統來“繼承”。顯然“實際檔案系統”要實現“基類”的一些“成員”才能工作,具體要實現哪些“成員”這就就看實際情況了。虛擬第二層含義其實是與儲存相關的,因為“實際檔案系統”是需要儲存在外存上的,比如磁碟、FLASH等非易失性儲存空間上。而虛擬檔案系統則不會佔用任何外存,他只會在核心啟動並執行過程中佔用記憶體資源,電一掉,就game
over了!

虛擬檔案系統中有一些概念是和我們通常所理解有點不一樣,非常有必要先說明,否則大家會頭暈。

首當其衝的當然是檔案這個概念了,在虛擬檔案系統中也有檔案這個概念,叫檔案對象,我們回顧一下之前講字元裝置中提到的fd。其實fd就是一個數字,這個數字與我們的檔案對象就像許仙和白娘子一樣,無論法海怎麼壞,都拆不散的。有代碼為證:

所在檔案位置:fs/open.c

函數呼叫堆疊:sys_open()->do_sys_open()->fd_install(fd, f);

下面是fd_install()的函數定義:

void fd_install(unsigned int fd, struct file *file)

{

         struct files_struct *files = current->files;

         struct fdtable *fdt;

         spin_lock(&files->file_lock);

         fdt = files_fdtable(files);

         BUG_ON(fdt->fd[fd] != NULL);

         rcu_assign_pointer(fdt->fd[fd], file);

         spin_unlock(&files->file_lock);

}

第一行,struct files_struct *files = current->files;這中間的cureent其實就是代表了當前進程。由此可見檔案對象是屬於進程的一種資源,進程是整台機器硬體資源的虛擬,這整台機器自然包括了我們平時用於存放陳冠希老師作品的外存放裝置了,最典型的就是硬碟啦。硬碟被虛擬成了file,然後偉大的linus進一步將其簡化成一個fd,供我們這些菜鳥使用。另外檔案對象做為進程的資源,也是一個動態概念,你可以認為linux核心為我們準備了一個“檔案對象池”,我們要的時候(open)他就分配一個給我們,不要了,我們就歸還(close)給他。並且這個池子還比較聰明,隨著你要求的提高(同時開啟的檔案數量變大)而跟著增加池子裡檔案對象的數量。在這裡我們先不討論這些進階的細節。只要知道有這麼回事就行了。

所以檔案對象根本不是我們通常意義所說的檔案,真正意義的檔案其實就是儲存在外儲存空間(對於記憶體型檔案系統則還是存在記憶體上)上的一塊資料而已。這個檔案可以是我們通常所說的檔案或目錄。

說到目錄,我們通常理解的目錄就是一種特殊的檔案,和管道,裝置等一起構成了linux下所謂的“一切皆檔案”中所指的檔案。挺繞的,幾個檔案搞來搞去有點暈了。仔細體會一下。而在虛擬檔案系統中的目錄對象,則是一個更加抽象的東西,這個玩意有人也把他叫為目錄項對象,有的又叫目錄項緩衝,有的又叫dcache,還有的叫目錄項cache。在這裡我們統一叫這個玩意為目錄項對象。我們不是孔兄,不用去研究茴香豆的茴字有幾種寫法,這年頭我發現就是因為孔兄太多,玩核心較熟的同志其實有的時候經常是上一句說目錄項對象,下一句說dcache,撞到像我這種會點的還好,要是和新手這麼講的話,等新手變老手的時候,回想起當年你那裝B的鳥樣,不問候你先人才是怪事。OK。牢騷發的差不多了。

目錄項對象的作用其實正如他的別名dcache,就是個目錄項緩衝而已,我們在一個目錄下運行ls的時候(這個目錄是指我們通常所說的目錄),可以查看到目前的目錄下所有的子目錄或者檔案,如果運行ls –a,還可以查看另外兩個東東:.和..。分別指代目前的目錄和上一級目錄。想像一下吧,這整個結構就像是一顆樹。並且我們經常要做目錄切換的操作,每操作一次,就要讀一次相應的資訊,操作一次外存放裝置(我們這裡就假定是硬碟吧),硬碟累,核心也累,所以目錄項的作用其實就是緩衝。核心允許這個緩衝也就是說目錄項的個數預設是根據記憶體大小來算的,並且在記憶體吃緊的情況下又會回收。致於這個演算法我就先不扯了。只要知道有這麼一回事就行了,其實我們在學習核心的過程中發現了linux核心的一個特性,說誇張點叫智能,說得實在點就是具有自調節功能。

Inode,索引節點,又有人叫索引節點對象,在這裡我們全都叫索引節點對象,全部的名字都統一叫XX對象有三個原因,一,與傳統的概念區分開發。二,統一尾碼,大家聽起來也舒服點。最後,這個原因也是最重要的,因為虛擬檔案系統採用了物件導向的思想,將資料與演算法(演算法後面會討論)統一封裝在我們所說的“對象”當中。索引節點對象是本文引入的第三種對象,這些對象都很重要,但是就檔案系統的核心而言,索引節點對象是重中之重,理解了索引節點對象就理解了虛擬檔案系統的一半。索引節點對象代表了我們通常所說的檔案。一般來說都儲存在磁碟等外存放裝置上,當然啦,某些特例除外。比如procfs,sysfs等偽檔案系統中的索引節點對象就直接放在記憶體裡面啦。索引節點對象可以被多個目錄項對象引用,比如永久連結。(軟連結不是的,軟連結是有自已的索引節點對象的,因此可以跨檔案系統),在這裡有必要說明一下,索引節點對象也和目錄項對象一樣,也是會緩衝到記憶體中的。

超級塊,又名super block,也有人叫超級塊對象等。一般來說一個超級塊對象就代表了一個被掛載的檔案系統,或者說一個分區吧。一個檔案系統可以被同時掛載到一個或多個地方。超級塊對象是個家長,一家之中家長最大,沒有家長,哪來的孩子(索引節點對象等)啊?不過最近據說謝霆鋒家長懷疑孩子不是自已造的。哎,老婆的相片也照了,錢也被捲走了,突然間孩子是不是自已造的都不知道了,真悲劇!不過在linux核心中永遠不會有這種悲劇發生,每個孩子都知道自已的親爹是誰,每個爹也不需要藉助DNA檢測技術能認得自已的孩子。

Address space object,地址空間對象,這是一套統一外存與記憶體的介面,比如我們經常會將一個檔案利用mmap映射成一段記憶體,這個就需要用到地址空間對象了,地址空間對象主要就是為了索引節點管理緩衝中的各種頁對象。

好了,到這裡我們要總結一下了,實際位於磁碟上的對象有幾個?

兩個,超級塊對象和索引節點對象,在檔案系統被掛載後,我們進行查看或操作時就會多出檔案對象和目錄項對象。檔案對象是為了方便我們使用者使用的,而目錄項對象是起緩衝作用,加速我們的操作,降低硬碟的讀寫次數。

別急,還有一個東西要講一下。file_system_type,這個東西有的同志又叫檔案系統類型,有的又叫檔案系統對象。沒事,我們這裡全都叫檔案系統對象。這個,才是真正描述一個檔案系統的,是一個更高層次的概念。比如一個ext3檔案系統,我們一個ext3類型的分區中有一個ext3超級塊對象,但我們LINUX可以支援多個分區,這時對應有多個ext3超級塊對象,這些對象按照先後順序掛在ext3檔案系統對象上。所以真正的老大是檔案系統對象。就像一個家族的族長一樣。而我們都知道性氏有很多,比如有的姓張,有的人姓李,所以在我們的核心中難免會有多個檔案系統對象。

仔細理解這些概念,一定要想清楚,這些東西是檔案系統最基本的概念。好了,今天就先到這吧。下一節見。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.