導航:首頁 > 文件類型 > linux文件結構體

linux文件結構體

發布時間:2023-04-05 06:04:38

linux文件描述符fd和struct file結構體

簡單歸納 : fd 只是一個整數,在 open 時產生。起到一個索引的作用,進程通過 PCB 中的 文件描述符表 找到該 fd 所指向的文件指針 filp 。

⑵ linux文件系統採用哪種物理結構,有什麼優點和缺點

一、順序結構

優點:

1、支持順序存取和隨機存取。

2、順序存取速度快。

3、所需的磁碟尋道次數和尋道時間最少。

缺點:

1、需要為每個文件預留若干物理塊以滿足文件增長的部分需要。

2、不利於文件插入和刪除。

二、鏈式結構

優點:

1、提高了磁碟空間利用率,不需要為每個文件預留物理塊。

2、有利於文件插入和刪除。

3、有利於文件動態擴充。

缺點:

1、存取速度慢,不適於隨機存取。

2、當物理塊間的連接指針出錯時,數據丟失。

3、更多的尋道次數和尋道時間。

4、鏈接指針佔用一定的空間,降低了空間利用率。

三、索引結構

優點:

1、不需要為每個文件預留物理塊。

2、既能順序存取,又能隨機存取。

3、滿足了文件動態增長、插入刪除的要求。

缺點:

1、較多的尋道次數和尋道時間。

2、索引表本身帶來了系統開銷。如:內外存空間,存取時間等。

拓展資料:

文件存取方法:

順序存取:順序存取是按照文件的邏輯地址順序存取。

固定長記錄的順序存取是十分簡單的。讀操作總是讀出上一次讀出的文件的下一個記錄,同時,自動讓文件記錄讀指針推進,以指向下一次要讀出的記錄位置。如果文件是可讀可寫的。再設置一個文件記錄指針,它總指向下一次要寫入記錄的存放位置,執行寫操作時,將一個記錄寫到文件 末端。允許對這種文件進行前跳或後退N(整數)個記錄的操作。順序存取主要用於磁帶文件,但也適用於磁碟上的順序文件。

可變長記錄的順序文件,每個記錄的長度信息存放於記錄前面一個單元中,它的存取操作分兩步進行。讀出時,根據讀指針值先讀出存放記錄長度的單元 。然後,得到當前記錄長後再把當前記錄一起寫到指針指向的記錄位置,同時,調整寫指針值 。

由於順序文件是順序存取的,可採用成組和分解操作來加速文件的輸入輸出。


直接存取(隨機存取法):

很多應用場合要求以任意次序直接讀寫某個記錄。例如,航空訂票系統,把特定航班的所有信息用航班號作標識,存放在某物理塊中,用戶預訂某航班時,需要直接將該航班的信息取出。直接存取方法便適合於這類應用,它通常用於磁碟文件。

為了實現直接存取,一個文件可以看作由順序編號的物理塊組成的,這些塊常常劃成等長,作為定位和存取的一個最小單位,如一塊為1024位元組、4096位元組,視系統和應用而定。於是用戶可以請求讀塊22、然後,寫塊48,再讀塊9等等。直接存取文件對讀或寫塊的次序沒有限制。用戶提供給操作系統的是相對塊號,它是相對於文件開始位置的一個位移量,而絕對塊號則由系統換算得到。


索引存取:

第三種類型的存取是基於索引文件的索引存取方法。由於文件中的記錄不按它在文件中的位置,而按它的記錄鍵來編址,所以,用戶提供給操作系統記錄鍵後就可查找到所需記錄。通常記錄按記錄鍵的某種順序存放,例如,按代表健的字母先後次序來排序。對於這種文件,除可採用按鍵存取外,也可以採用順序存取或直接存取的方法。信息塊的地址都可以通過查找記錄鍵而換算出。實際的系統中,大都採用多級索引,以加速記錄查找過程。

⑶ linux驅動程序結構框架及工作原理分別是什麼

一、Linux device driver 的概念x0dx0ax0dx0a系統調用是操作系統內核和應用程序之間的介面,設備驅動程序是操作系統內核和機器硬體之間的介面。設備驅動程序為應用程序屏蔽了硬體的細節,這樣在應用程序看來,硬體設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬體設備進行操作。設備驅動程序是內核的一部分,它完成以下的功能:x0dx0ax0dx0a1、對設備初始化和釋放;x0dx0ax0dx0a2、把數據從內核傳送到硬體和從硬體讀取數據;x0dx0ax0dx0a3、讀取應用程序傳送給設備文件的數據和回送應用程序請求的數據;x0dx0ax0dx0a4、檢測和處理設備出現的錯誤。x0dx0ax0dx0a在Linux操作系統下有三類主要的設備文件類型,一是字元設備,二是塊設備,三是網路設備。字元設備和塊設備的主要區別是:在對字元設備發出讀/寫請求時,實際的硬體I/O一般就緊接著發生了,塊設備則不然,它利用一塊系統內存作緩沖區,當用戶進程對設備請求能滿足用戶的要求,就返回請求的數據,如果不能,就調用請求函數來進行實際的I/O操作。塊設備是主要針對磁碟等慢速設備設計的,以免耗費過多的CPU時間來等待。x0dx0ax0dx0a已經提到,用戶進程是通過設備文件來與實際的硬體打交道。每個設備文件都都有其文件屬性(c/b),表示是字元設備還是塊設備?另外每個文件都有兩個設備號,第一個是主設備號,標識驅動程序,第二個是從設備號,標識使用同一個設備驅動程序的不同的硬體設備,比如有兩個軟盤,就可以用從設備號來區分他們。設備文件的的主設備號必須與設備驅動程序在登記時申請的主設備號一致,否則用戶進程將無法訪問到驅動程序。x0dx0ax0dx0a最後必須提到的是,在用戶進程調用驅動程序時,系統進入核心態,這時不再是搶先式調度。也就是說,系統必須在你的驅動程序的子函數返回後才能進行其他的工作。如果你的驅動程序陷入死循環,不幸的是你只有重新啟動機器了,然後就是漫長的fsck。x0dx0ax0dx0a二、實例剖析x0dx0ax0dx0a我們來寫一個最簡單的字元設備驅動程序。雖然它什麼也不做,但是通過它可以了解Linux的設備驅動程序的工作原理。把下面的C代碼輸入機器,你就會獲得一個真正的設備驅動程序。x0dx0ax0dx0a由於用戶進程是通過設備文件同硬體打交道,對設備文件的操作方式不外乎就是一些系統調用,如 open,read,write,close?, 注意,不是fopen, fread,但是如何把系統調用和驅動程序關聯起來呢?這需要了解一個非常關鍵的數據結構:x0dx0ax0dx0aSTruct file_operatiONs {x0dx0ax0dx0aint (*seek) (struct inode * ,struct file *, off_t ,int);x0dx0ax0dx0aint (*read) (struct inode * ,struct file *, char ,int);x0dx0ax0dx0aint (*write) (struct inode * ,struct file *, off_t ,int);x0dx0ax0dx0aint (*readdir) (struct inode * ,struct file *, struct dirent * ,int);x0dx0ax0dx0aint (*select) (struct inode * ,struct file *, int ,select_table *);x0dx0ax0dx0aint (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);x0dx0ax0dx0aint (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);x0dx0ax0dx0aint (*open) (struct inode * ,struct file *);x0dx0ax0dx0aint (*release) (struct inode * ,struct file *);x0dx0ax0dx0aint (*fsync) (struct inode * ,struct file *);x0dx0ax0dx0aint (*fasync) (struct inode * ,struct file *,int);x0dx0ax0dx0aint (*check_media_change) (struct inode * ,struct file *);x0dx0ax0dx0aint (*revalidate) (dev_t dev);x0dx0ax0dx0a}x0dx0ax0dx0a這個結構的每一個成員的名字都對應著一個系統調用。用戶進程利用系統調用在對設備文件進行諸如read/write操作時,系統調用通過設備文件的主設備號找到相應的設備驅動程序,然後讀取這個數據結構相應的函數指針,接著把控制權交給該函數。這是linux的設備驅動程序工作的基本原理。既然是這樣,則編寫設備驅動程序的主要工作就是編寫子函數,並填充file_operations的各個域。x0dx0ax0dx0a下面就開始寫子程序。x0dx0ax0dx0a#include 基本的類型定義x0dx0ax0dx0a#include 文件系統使用相關的頭文件x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0aunsigned int test_major = 0;x0dx0ax0dx0astatic int read_test(struct inode *inode,struct file *file,char *buf,int count)x0dx0ax0dx0a{x0dx0ax0dx0aint left; 用戶空間和內核空間x0dx0ax0dx0aif (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )x0dx0ax0dx0areturn -EFAULT;x0dx0ax0dx0afor(left = count ; left > 0 ; left--)x0dx0ax0dx0a{x0dx0ax0dx0a__put_user(1,buf,1);x0dx0ax0dx0abuf++;x0dx0ax0dx0a}x0dx0ax0dx0areturn count;x0dx0ax0dx0a}x0dx0ax0dx0a這個函數是為read調用准備的。當調用read時,read_test()被調用,它把用戶的緩沖區全部寫1。buf 是read調用的一個參數。它是用戶進程空間的一個地址。但是在read_test被調用時,系統進入核心態。所以不能使用buf這個地址,必須用__put_user(),這是kernel提供的一個函數,用於向用戶傳送數據。另外還有很多類似功能的函數。請參考,在向用戶空間拷貝數據之前,必須驗證buf是否可用。這就用到函數verify_area。為了驗證BUF是否可以用。x0dx0ax0dx0astatic int write_test(struct inode *inode,struct file *file,const char *buf,int count)x0dx0ax0dx0a{x0dx0ax0dx0areturn count;x0dx0ax0dx0a}x0dx0ax0dx0astatic int open_test(struct inode *inode,struct file *file )x0dx0ax0dx0a{x0dx0ax0dx0aMOD_INC_USE_COUNT; 模塊計數加以,表示當前內核有個設備載入內核當中去x0dx0ax0dx0areturn 0;x0dx0ax0dx0a}x0dx0ax0dx0astatic void release_test(struct inode *inode,struct file *file )x0dx0ax0dx0a{x0dx0ax0dx0aMOD_DEC_USE_COUNT;x0dx0ax0dx0a}x0dx0ax0dx0a這幾個函數都是空操作。實際調用發生時什麼也不做,他們僅僅為下面的結構提供函數指針。x0dx0ax0dx0astruct file_operations test_fops = {?x0dx0ax0dx0aread_test,x0dx0ax0dx0awrite_test,x0dx0ax0dx0aopen_test,x0dx0ax0dx0arelease_test,x0dx0ax0dx0a};x0dx0ax0dx0a設備驅動程序的主體可以說是寫好了。現在要把驅動程序嵌入內核。驅動程序可以按照兩種方式編譯。一種是編譯進kernel,另一種是編譯成模塊(moles),如果編譯進內核的話,會增加內核的大小,還要改動內核的源文件,而且不能動態的卸載,不利於調試,所以推薦使用模塊方式。x0dx0ax0dx0aint init_mole(void)x0dx0ax0dx0a{x0dx0ax0dx0aint result;x0dx0ax0dx0aresult = register_chrdev(0, "test", &test_fops); 對設備操作的整個介面x0dx0ax0dx0aif (result < 0) {x0dx0ax0dx0aprintk(KERN_INFO "test: can't get major number\n");x0dx0ax0dx0areturn result;x0dx0ax0dx0a}x0dx0ax0dx0aif (test_major == 0) test_major = result; /* dynamic */x0dx0ax0dx0areturn 0;x0dx0ax0dx0a}x0dx0ax0dx0a在用insmod命令將編譯好的模塊調入內存時,init_mole 函數被調用。在這里,init_mole只做了一件事,就是向系統的字元設備表登記了一個字元設備。register_chrdev需要三個參數,參數一是希望獲得的設備號,如果是零的話,系統將選擇一個沒有被佔用的設備號返回。參數二是設備文件名,參數三用來登記驅動程序實際執行操作的函數的指針。x0dx0ax0dx0a如果登記成功,返回設備的主設備號,不成功,返回一個負值。x0dx0ax0dx0avoid cleanup_mole(void)x0dx0ax0dx0a{x0dx0ax0dx0aunregister_chrdev(test_major,"test");x0dx0ax0dx0a}x0dx0ax0dx0a在用rmmod卸載模塊時,cleanup_mole函數被調用,它釋放字元設備test在系統字元設備表中佔有的表項。x0dx0ax0dx0a一個極其簡單的字元設備可以說寫好了,文件名就叫test.c吧。x0dx0ax0dx0a下面編譯 :x0dx0ax0dx0a$ gcc -O2 -DMODULE -D__KERNEL__ -c test.c _c表示輸出制定名,自動生成.o文件x0dx0ax0dx0a得到文件test.o就是一個設備驅動程序。x0dx0ax0dx0a如果設備驅動程序有多個文件,把每個文件按上面的命令行編譯,然後x0dx0ax0dx0ald ?-r ?file1.o ?file2.o ?-o ?molename。x0dx0ax0dx0a驅動程序已經編譯好了,現在把它安裝到系統中去。x0dx0ax0dx0a$ insmod ?_f ?test.ox0dx0ax0dx0a如果安裝成功,在/proc/devices文件中就可以看到設備test,並可以看到它的主設備號。要卸載的話,運行 :x0dx0ax0dx0a$ rmmod testx0dx0ax0dx0a下一步要創建設備文件。x0dx0ax0dx0amknod /dev/test c major minorx0dx0ax0dx0ac 是指字元設備,major是主設備號,就是在/proc/devices里看到的。x0dx0ax0dx0a用shell命令x0dx0ax0dx0a$ cat /proc/devicesx0dx0ax0dx0a就可以獲得主設備號,可以把上面的命令行加入你的shell script中去。x0dx0ax0dx0aminor是從設備號,設置成0就可以了。x0dx0ax0dx0a我們現在可以通過設備文件來訪問我們的驅動程序。寫一個小小的測試程序。x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0a#include x0dx0ax0dx0amain()x0dx0ax0dx0a{x0dx0ax0dx0aint testdev;x0dx0ax0dx0aint i;x0dx0ax0dx0achar buf[10];x0dx0ax0dx0atestdev = open("/dev/test",O_RDWR);x0dx0ax0dx0aif ( testdev == -1 )x0dx0ax0dx0a{x0dx0ax0dx0aprintf("Cann't open file \n");x0dx0ax0dx0aexit(0);x0dx0ax0dx0a}x0dx0ax0dx0aread(testdev,buf,10);x0dx0ax0dx0afor (i = 0; i < 10;i++)x0dx0ax0dx0aprintf("%d\n",buf[i]);x0dx0ax0dx0aclose(testdev);x0dx0ax0dx0a}x0dx0ax0dx0a編譯運行,看看是不是列印出全1 x0dx0ax0dx0a以上只是一個簡單的演示。真正實用的驅動程序要復雜的多,要處理如中斷,DMA,I/O port等問題。這些才是真正的難點。上述給出了一個簡單的字元設備驅動編寫的框架和原理,更為復雜的編寫需要去認真研究LINUX內核的運行機制和具體的設備運行的機制等等。希望大家好好掌握LINUX設備驅動程序編寫的方法。

⑷ linux下的FILE結構體詳細定義是什麼樣的啊,求助

首先你建立你的ctags 索引文件吧。 ctags -R . 注意 -R 後邊空格再加『.』 。然後就可以使用快捷鍵 ctrl + ] 或者 在可視模式下 :ts + 你要查找得函數或結構體 定義 大概就是這樣 好久沒用了。。 具體 詳細的用花 請google ctags 用法吧

⑸ linux c 結構體怎麼賦值

在 username() 和 password() 兩個函數中使用的 x 是從哪裡來的? 顯然不是通過調用的時候傳入的,那麼,他們的專值在 username() 里 和 password() 里是否一致屬? 我估計兩次的 x 不一致,比方說賦值 username時,x = 3, 而在 下一步走到 password 里的時候, x = 5 了,那當然就不對了。所以你應該貼上來和 x 有關的代碼。

⑹ linux kernel 文件系統編程介面

進程讀寫文件之前需要 打開文件 ,得到 文件描述符 ,然後 通過文件描述符讀寫文件 .

內核提供了兩個打開文件的系統調用 open openat .

打開文件的主要步驟如下:
(1)需要 在父目錄的數據中查找文件對應的目錄項 , 從目錄項得到索引節點的編號,然後在內存中創建索引節點的副本 .因為各種文件系統類型的物理結構不同,所以需要提供索引節點操作集合的 lookup 方法和文件操作集合的 open 方法.
(2)需要分配文件的一個打開實例-- file 結構體,關聯到文件的索引節點.
(3)在進程的打開文件表中 分配一個文件描述符 , 把文件描述符和打開實例的映射添加到進程的打開文件表 中.

進程可通過使用系統調用 close 關閉文件.
系統調用close的執行流程如下:
(1)解除打開文件表和file實例的關聯.
(2)在close_on_exec點陣圖中清楚文件描述符對應的位.
(3)釋放文件描述符,在文件描述符點陣圖中清除文件描述符對應的位.
(4)調用函數fput釋放file實例:把引用計數減1,如果引用計數是0,那麼把file實例添加到鏈表delayed_fput_list中,然後調用延遲工作項delayed_fput_work.
延遲工作項delayed_fput_work的處理函數是flush_delayed_fput,遍歷鏈表delayed_fput_list,針對每個file實例,調用函數__fput來加以釋放.

創建不同類型的文件,需要使用不同的命令.
(1) 普通文件 :touch FILE ,這條命令本來用來更新文件的訪問時間和修改時間,如果文件不存在,創建文件.
(2) 目錄 :mkdir DIRECTORY .
(3) 符號鏈接(軟鏈接) :ln -s TARGET LINK_NAME 或ln --symbolic TARGET LINK_NAME .
(4) 字元或塊設備文件 :mknod NAME TYPE [MAJOR MINOR] .
(5) 命名管道 :mkpipe NAME .
(6) 硬連接 :命令"ln TARGETLINK_NAME ".給已經存在的文件增加新的名稱,文件的索引節點有一個硬鏈接計數,如果文件有n個名稱,那麼硬鏈接計數是n.

創建文件需要在文件系統中 分配一個索引節點 ,然後 在父目錄的數據中增加一個目錄項來保存文件的名稱和索引節點編號 .

刪除文件的命令如下:
(1)刪除任何類型文件:unlink FILE .
(2)rm FILE ,默認不刪除目錄,如果使用"-r""-R"或"-recursive",可以刪除目錄和目錄的內容.
(3)刪除目錄:rmdir DICTIONARY .
內核提供了unlink,unlinkat用來刪除文件的名稱,如果文件的硬鏈接計數變成0,並且沒有進程打開這個文件,那麼刪除文件.提供了rmdir刪除目錄.

刪除文件需要從父目錄的數據中刪除文件對應的目錄項, 把文件的索引節點的硬鏈接計數減1(一個文件可以有多個名稱,Linux把文件名稱稱為硬鏈接),如果索引節點的硬鏈接計數變成0,那麼釋放索引節點 .因為各種文件系統的物理結構不同,所以需要提供索引節點操作集合的 unlink 方法.

設置文件許可權的命令如下:
(1)chmod [OPTION]... MODE[, MODE]... FILE...
mode : 許可權設定字串,格式[ugoa...][[+-=][rwxX]...][,...]
其中:

(2)chmod [OPTION]... OCTAL-MODE FILE...
參數OCTAL-MODE是八進制數值.
系統調用chmod負責修改文件許可權.

修改文件許可權需要修改文件的索引節點的文件模式欄位,文件模式欄位包含文件類型和訪問許可權.因為各種文件系統類型的索引節點不同,所以需要提供索引節點操作集合的 setattr 方法.

訪問外部存儲設備的速度很慢,為了避免每次讀寫文件時訪問外部存儲設備, 文件系統模塊為每個文件在內存中創建一個緩存 ,因為 緩存的單位是頁 ,所以稱為 頁緩存 .
(1) 索引節點的成員i_mapping 指向地址空間結構體(address_space).進程在打開文件的時候, 文件打開實例(file結構體)的成員f_mapping 也會指向文件的地址空間.
(2)每個文件有一個地址空間結構體 address_space ,成員 page_tree 的類型是結構體radix_tree_root:成員 gfp_mask是分配內存頁的掩碼,成員rnode指向基數樹的根節點 .
(3)使用基數樹管理頁緩存,把文件的頁索引映射到內存頁的頁描述符.

每個文件都有一個地址空間結構體address_space,用來建立數據緩存(在內存中為某種數據創建的緩存)和數據來源(即存儲設備)之間的關聯.結構體address_space如下:

地址空間操作結合address_space_operations的主要成員如下:

頁緩存的常用操作函數如下:
(1)函數find_get_page根據文件的頁索引在頁緩存中查找內存頁.

(2)函數find_or_create_page根據文件的頁索引在頁緩存中查找內存頁,如果沒有找到內存頁,那麼分配一個內存頁,然後添加到頁緩存中.

(3)函數add_to_page_cache_lru把一個內存頁添加到頁緩存和LRU鏈表中.

(4)函數delete_from_page_cache從頁緩存中刪除一個內存頁.

進程讀文件的方式有3種:
(1)調用內核提供的 讀文件的系統調用 .
(2)調用glibc庫封裝的讀文件的 標准I/O流函數 .
(3)創建基於文件的內存映射,把 文件的一個區間映射到進程的虛擬地址空間,然後直接讀內存 .
第2種方式在用戶空間創建了緩沖區,能減少系統調用的次數,提高性能.第3種方式可以避免系統調用,性能最高.

讀文件的主要步驟如下:
(1)調用具體文件系統類型提供的文件操作集合的read和read_iter方法來讀文件.
(2) read或read_iter方法根據頁索引在文件的頁緩存中查找頁,如果沒有找到,那麼調用具體文件系統類型提供的地址空間集合的readpage方法來從存儲設備讀取文件頁到內存中 .
為了提高讀文件的速度,從存儲設備讀取文件頁到內存中的時候,除了讀取請求的文件頁,還會預讀後面的文件頁.如果進程按順序讀文件,預讀文件頁可以提高讀文件的速度;如果進程隨機讀文件,預讀文件頁對提高讀文件的速度幫助不大.

進程寫文件的方式有3種:
(1)調用內核提供的 寫文件的系統調用 .
(2)調用glibc庫封裝的寫文件的 標准I/O流函數 .
(3)創建基於文件的內存映射,把 文件的一個區間映射到進程的虛擬空間,然後直接寫內存 .
第2種方式在用戶空間創建了緩沖區,能夠減少系統調用的次數,提高性能.第3種方式可以避免系統調用,性能最高.

寫文件的主要步驟如下:
(1)調用具體文件系統類型提供的文件操作集合的write或write_iter方法來寫文件.
(2)write或write_iter方法調用文件的地址空間操作集合的 write_begin 方法, 在頁緩存查找頁,如果頁不存在就分配頁;然後把數據從用戶緩沖區復制到頁緩存的頁中 ;最後調用文件的地址空間操作集合的 write_end 方法.

進程寫文件時,內核的文件系統模塊把數據寫到文件的頁緩存,沒有立即寫回到存儲設備.文件系統模塊會定期把臟頁寫回到存儲設備,進程也可以調用系統調用把臟頁強制寫回到存儲設備.

管理員可以執行命令"sync",把內存中所有修改過的文件元數據和文件數據寫回到存儲設備.
內核提供了 sync , syncfs , fsync , fdatasync , sync_file_range 等系統調用用於文件寫回.

把文件寫回到存儲設備的時機如下:
(1)周期回寫.
(2)當臟頁的數量達到限制的時候,強制回寫.
(3)進程調用sync和syncfs等系統調用.

對於類似內存的塊設備,例如NVDIMM設備,不需要把文件從存儲設備復制到頁緩存.DAX繞過頁緩存,直接訪問存儲設備,對於基於文件的內存映射,直接把存儲設備映射到進程的虛擬地址空間.
調用系統調用mmap創建基於文件的內存映射,把文件的一個區間映射到進程的虛擬地址空間,這會調用具體文件系統類型提供的文件操作集合的mmap方法.mmap方法針對設置了標志位S_DAX的索引節點,處理方法如下:
(1)給虛擬內存區域設置標志位VM_MIXEDMAP和VM_HUGEPAGE.
(2)設置虛擬內存操作集合,提供fault,huge_fault,page_mkwrite和pfn_mkwrite方法.

⑺ Linux目錄結構

Windows操作系統抄的目錄結構,是以盤符為單位,C盤、D盤、E盤等等,數據存儲在各個盤符之下,而Linux操作系統最頂層只有一個根目錄root,所有文件都存儲在這一個根目錄之下。
Windows操作系統若插入一個外部設備(U盤等),在系統中是多了一個盤符H,對H盤的操作就是對外部設備的操作。Linux操作系統是在根目錄root下有一個名叫mnt的子目錄,在這個目錄下,會出現一個目錄,假設為sdcard,稱之為掛載點,對它的操作就是對外部設備的操作。
Windows操作系統某用戶登錄系統後,對所有文件都具有增刪改查的許可權,即:可以操作任意目錄,假設將C盤下Windows目錄刪除,則會導致系統異常,安全性較差。Linux操作系統對許可權要求比較嚴格,用戶登錄後並非對所有目錄具有增刪改查許可權,默認的當前目錄為根目錄下的home目錄下的soft01,稱之為主目錄,對這個目錄具有最高許可權,其餘目錄文件一般都是只讀的,不能隨意刪除,這樣就保證了安全性。

⑻ linux中什麼是文件結構體

struct file結構體定義在include/linux/fs.h中定義。文件結構體代表一個打開的文件,系統中的每個打開的文件在內核空間都有一個關聯的 struct file。它由內核在打開文件時創建,並傳遞給在文件上進行操作的任何函數。在文件的所有實例都關閉後,內核釋放這個數據結構。在內核創建和驅動源碼中,struct file的指針通常被命名為file或filp。

⑼ linux文件系統基礎知識

linux文件系統基礎知識匯總

1、linux文件系統分配策略

塊分配( block allocation ) 和 擴展分配 ( extent allocation )

塊分配:磁碟上的文件塊根據需要分配給文件,避免了存儲空間的浪費。但當文件擴充時,會造成文件中文件塊的不連續,從而導致過多的磁碟尋道時間。

每一次文件擴展時,塊分配演算法就需要寫入文件塊的結構信息,也就是 meta-dada 。meta-data總是與文件一起寫入存儲設備,改變文件的操作要等到所有meta-data的操作都完成後才能進行,

因此,meta-data的操作會明顯降低整個文件系統的性能。

擴展分配: 文件創建時,一次性分配一連串連續的塊,當文件擴展時,也一次分配很多塊。meta-data在文件創建時寫入,當文件大小沒有超過所有已分配文件塊大小時,就不用寫入meta-data,直到需要再分配文件塊的時候。

擴展分配採用成組分配塊的方式,減少了SCSI設備寫數據的時間,在讀取順序文件時具有良好的性能,但隨機讀取文件時,就和塊分配類似了。

文件塊的組或塊簇 ( block cluster) 的大小是在編譯時確定的。簇的大小對文件系統的性能有很大的影響。

註: meta-data 元信息:和文件有關的信息,比如許可權、所有者以及創建、訪問或更改時間等。

2、文件的記錄形式

linux文家系統使用索引節點(inode)來記錄文件信息。索引節點是一種數據結構,它包含了一個文件的長度、創建及修改時間、許可權、所屬關系、磁碟中的位置等信息。

一個文件系統維護了一個索引節點的數組,每個文件或目錄都與索引節點數組中的唯一的元素對應。每個索引節點在數組中的索引號,稱為索引節點號。

linux文件系統將文件索引節點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節點號結合在一起的一張表,目錄中每一對文件名稱和索引節點號稱為一個連接。

對於一個文件來說,有一個索引節點號與之對應;而對於一個索引節點號,卻可以對應多個文件名。

連接分為軟連接和硬連接,其中軟連接又叫符號連接。

硬連接: 原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;硬連接不能跨文件系統(不能跨越不同的分區),文件在磁碟中只有一個拷貝。

由於刪除文件要在同一個索引節點屬於唯一的連接時才能成功,因此硬連接可以防止不必要的誤刪除。

軟連接: 用 ln -s 命令建立文件的符號連接。符號連接是linux特殊文件的.一種,作為一個文件,它的數據是它所連接的文件的路徑名。沒有防止誤刪除的功能。

3、文件系統類型:

ext2 : 早期linux中常用的文件系統

ext3 : ext2的升級版,帶日誌功能

RAMFS : 內存文件系統,速度很快

NFS : 網路文件系統,由SUN發明,主要用於遠程文件共享

MS-DOS : MS-DOS文件系統

VFAT : Windows 95/98 操作系統採用的文件系統

FAT : Windows XP 操作系統採用的文件系統

NTFS : Windows NT/XP 操作系統採用的文件系統

HPFS : OS/2 操作系統採用的文件系統

PROC : 虛擬的進程文件系統

ISO9660 : 大部分光碟所採用的文件系統

ufsSun : OS 所採用的文件系統

NCPFS : Novell 伺服器所採用的文件系統

SMBFS : Samba 的共享文件系統

XFS : 由SGI開發的先進的日誌文件系統,支持超大容量文件

JFS :IBM的AIX使用的日誌文件系統

ReiserFS : 基於平衡樹結構的文件系統

udf: 可擦寫的數據光碟文件系統

4、虛擬文件系統VFS

linux支持的所有文件系統稱為邏輯文件系統,而linux在傳統的邏輯文件系統的基礎上增加料一個蓄念文件系統( Vitual File System ,VFS) 的介面層。

虛擬文件系統(VFS) 位於文件系統的最上層,管理各種邏輯文件系統,並可以屏蔽各種邏輯文件系統之間的差異,提供統一文件和設備的訪問介面。

5、文件的邏輯結構

文件的邏輯結構可分為兩大類: 位元組流式的無結構文件 和 記錄式的有結構文件。

由位元組流(位元組序列)組成的文件是一種無結構文件或流式文件 ,不考慮文件內部的邏輯結構,只是簡單地看作是一系列位元組的序列,便於在文件的任意位置添加內容。

由記錄組成的文件稱為記錄式文件 ,記錄是這種文件類型的基本信息單位,記錄式文件通用於信息管理。

6、文件類型

普通文件 : 通常是流式文件

目錄文件 : 用於表示和管理系統中的全部文件

連接文件 : 用於不同目錄下文件的共享

設備文件 : 包括塊設備文件和字元設備文件,塊設備文件表示磁碟文件、光碟等,字元設備文件按照字元操作終端、鍵盤等設備。

管道(FIFO)文件 : 提供進程建通信的一種方式

套接字(socket) 文件: 該文件類型與網路通信有關

7、文件結構: 包括索引節點和數據

索引節點 : 又稱 I 節點,在文件系統結構中,包含有關相應文件的信息的一個記錄,這些信息包括文件許可權、文件名、文件大小、存放位置、建立日期等。文件系統中所有文件的索引節點保存在索引節點表中。

數據 : 文件的實際內容。可以是空的,也可以非常大,並且擁有自己的結構。

8、ext2文件系統

ext2文件系統的數據塊大小一般為 1024B、2048B 或 4096B

ext2文件系統採用的索引節點(inode):

索引節點採用了多重索引結構,主要體現在直接指針和3個間接指針。直接指針包含12個直接指針塊,它們直接指向包含文件數據的數據塊,緊接在後面的3個間接指針是為了適應文件的大小變化而設計的。

e.g: 假設數據塊大小為1024B ,利用12個直接指針,可以保存最大為12KB的文件,當文件超過12KB時,則要利用單級間接指針,該指針指向的數據塊保存有一組數據塊指針,這些指針依次指向包含有實際數據的數據塊,

假如每個指針佔用4B,則每個單級指針數據塊可保存 1024/4=256 個數據指針,因此利用直接指針和單級間接指針可保存 1024*12+1024*256=268 KB的文件。當文件超過268KB時,再利用二級間接指針,直到使用三級間接指針。

利用直接指針、單級間接指針、二級間接指針、三級間接指針可保存的最大文件大小為:

1024*12+1024*256+1024*256*256+1024*256*256*256=16843020 KB,約 16GB

若數據塊大小為2048B,指針佔4B,則最大文件大小為: 2048*12+2048*512+2048*512*512+2048*512*512*512=268,960,792 KB 約 268GB

若數據塊大小為4096B,指針佔4B,則最大文件大小為: 4096*12+4096*1024+4096*1024*1024+4096*1024*1024*1024=4,299,165,744 KB ,約 4TB

註: 命令 tune2fs -l /dev/sda5 可查看文件系統

ext2文件系統最大文件名長度: 255個字元

ext2文件系統的缺點:

ext2在寫入文件內容的同時並沒有同時寫入文件meta-data, 其工作順序是先寫入文件的內容,然後等空閑時候才寫入文件的meta-data。若發生意外,則文件系統就會處於不一致狀態。

在重新啟動系統的時候,linux會啟動 fsk ( file system check) 的程序,掃描整個文件系統並試圖修復,但不提供保證。

9、ext3文件系統:

ext3基於ext2的代碼,所以磁碟格式與ext2相同,使用相同的元數據。

ext2文件系統無損轉化為ext3文件系統: tune2fs -j /dev/sda6

日誌塊設備( Journaling block device layer,JBD)完成ext3文件系統日誌功能。JBD不是ext3文件系統所特有的,它的設計目標是為了向一個塊設備添加日誌功能。

當一個文件修改執行時,ext3文件系統代碼將通知JBD,稱為一個事務(transaction)。發生意外時,日誌功能具有的重放功能,能重新執行中斷的事務。

日誌中的3種數據模式:

1)、data=writeback :不處理任何形式的日誌數據,給用戶整體上的最高性能

2)、data=odered :只記錄元數據日誌,但將元數據和數據組成一個單元稱為事務(transaction) 。此模式保持所句句的可靠性與文件系統的一致性,性能遠低於data=writeback模式,但比data=journal模式快

3)、data=journal :提供完整的數據及元數據日誌,所有新數據首先被寫入日誌,然後才被定位。意外發生過後,日誌可以被重放,將數據與元數據帶回一致狀態。這種模式整體性能最慢,但數據需要從磁碟讀取和寫入磁碟時卻是3種模式中最快的。

ext3文件系統最大文件名長度: 255個字元

ext3文件系統的優點:可用性、數據完整性、速度、兼容性

10、ReiserFS文件系統

ReiserFS文件系統是由Hans Reiser和他領導的開發小組共同開發的,整個文件系統完全是從頭設計的,是一個非常優秀的文件系統。也是最早用於Linux的日誌文件系統之一。

ReiserFS的特點

先進的日誌機制

ReiserFS有先進的日誌(Journaling/logging)功能 機制。日誌機制保證了在每個實際數據修改之前,相應的日誌已經寫入硬碟。文件與數據的安全性有了很大提高。

高效的磁碟空間利用

Reiserfs對一些小文件不分配inode。而是將這些文件打包,存放在同一個磁碟分塊中。而其它文件系統則為每個小文件分別放置到一個磁碟分塊中。

獨特的搜尋方式

ReiserFS基於快速平衡樹(balanced tree)搜索,平衡樹在性能上非常卓越,這是一種非常高效的演算法。ReiserFS搜索大量文件時,搜索速度要比ext2快得多。Reiserfs文件 系統使用B*Tree存儲文件,而其它文件系統使用B+Tree樹。B*Tree查詢速度比B+Tree要快很多。Reiserfs在文件定位上速度非常 快。

在實際運用中,ReiserFS 在處理小於 4k 的文件時,比ext2 快 5 倍;帶尾文件壓縮功能(默認)的ReiserFS 比ext2文件系統多存儲6%的數據。

支持海量磁碟

ReiserFS是一個非常優秀的文件系統,一直被用在高端UNIX系統上,可輕松管理上百G的文件系統,ReiserFS文件系統最大支持的文件系統尺寸為16TB。這非常適合企業級應用中。

優異的性能

由於它的高效存儲和快速小文件I/O特點,使用ReiserFs文件系統的PC,在啟動X窗口系統時,所花的時間要比在同一台機器上使用ext2文 件系統少1/3。另外,ReiserFS文件系統支持單個文件尺寸為4G的文件,這為大型資料庫系統在linux上的應用提供了更好的選擇。

;

⑽ Linux常見文件結構體有哪些

linux虛擬文件系統核心數主要有以下幾個數據結構: * 超級塊結構(struct super_block {...} ) 該結構保存了一個被安裝在內linux系統上的文容件系統的信息。對於基於磁碟的文件系統,該結構一般和保存在磁碟上的"文件系統控制塊"對應。

閱讀全文

與linux文件結構體相關的資料

熱點內容
更改程序圖標c語言 瀏覽:629
網路電視偷停怎麼辦 瀏覽:418
linux連接ftp 瀏覽:512
es文件瀏覽器視頻筆記 瀏覽:874
mac無法打開描述文件 瀏覽:134
什麼軟體打文件 瀏覽:53
資料庫無數據變成0 瀏覽:899
名企筆試如何刷編程題 瀏覽:49
js跳到頁面某地 瀏覽:550
jsp展示clob欄位 瀏覽:779
nyx在網路上是什麼意思 瀏覽:145
樂播農業app是什麼 瀏覽:530
編程框架如何開發 瀏覽:136
金庸群俠傳3修改代碼 瀏覽:712
檢察院的文件類別有哪些 瀏覽:793
怎麼把九游殘留數據刪除 瀏覽:828
有什麼女生主動聊天的app 瀏覽:436
有哪些可以督促自己的app 瀏覽:244
用USB傳輸視頻文件夾顯示為空 瀏覽:710
恢復文件軟體免費版手機 瀏覽:648

友情鏈接