linux一切皆是檔案 LINUX一切皆檔案

2021-10-17 06:41:34 字數 4179 閱讀 5682

只要用過linux的筒子,或者保守點說接觸到一些linux思想的同志肯定聽說過這樣一句話,在linux下,「一切皆是檔案」!

不錯,今天walfred將在快速上手linux裝置驅動這一塊,談談linux的裝置也符合「一切皆是檔案」的思想在linux裝置驅動模型應用。如果你不理解linux裝置模型,請看下面:

「一切皆是檔案」是 unix/linux 的基本哲學之一。不僅普通的檔案,目錄、字元裝置、塊裝置、 套接字等在 unix/linux 中都是以檔案被對待;它們雖然型別不同,但是對其提供的卻是同一套操作介面。

當然,在這裡我先給大家上一道預備知識的大菜,不過這邊我先暫時小打小鬧下,稍微說下,日後詳述之。

有請vfs上場--

虛擬檔案系統(virtual file system, 簡稱 vfs),

是 linux 核心中的乙個軟體層,用於給使用者空間的程式提供檔案系統介面;同時,它也提供了核心中的乙個抽象功能,允許不同的檔案系統共存。系統中所

有的檔案系統不但依賴 vfs 共存,而且也依靠 vfs 協同工作。

為了能夠支援各種實際檔案系統,vfs 定義了所有檔案系統都支援的基本的、概念上的介面和資料

結構;同時實際檔案系統也提供 vfs 所期望的抽象介面和資料結構,將自身的諸如檔案、目錄等概念在形式

上與vfs的定義保持一致。換句話說,乙個實際的檔案系統想要被 linux 支援,就必須提供乙個符合vfs標準

的介面,才能與 vfs 協同工作。實際檔案系統在統一的介面和資料結構下隱藏了具體的實現細節,所以在vfs 層和核心的其他部分看來,所有檔案系統都

是相同的。下圖顯示了vfs在核心中與實際的檔案系統的協同關係。

正文從上圖,我們可以簡單的看出乙個在user space的應用程式通過系統呼叫,經過vfs層面,在和裝置驅動打交道,最後裝置驅動驅動對應裝置,這是乙個比較簡單的描述,如果分析起來也就不難得到:user

space的應用程式與vfs的介面就是系統呼叫,vfs與驅動程式的介面就是file_operations。

關於file_operations

從之前打過交道的字元裝置驅動,我們就知道存在了這麼一種file_operations結構體,我現在可以說在描述乙個裝置,我們使用者最接近的方

法是file_operations,linux每類裝置都定義了檔案操作方法,例如,字元裝置的操作方法為def_chr_fops,塊裝置為

def_blk_fops,網路裝置為bad_sock_fops。每種裝置型別底層操作方法是不一樣的,但是通過file_operations方法將

裝置型別的差異化遮蔽了,這就是linux能夠將所有裝置都理解為檔案的緣由。這裡因為我這幾天在搞塊裝置,所以先看下def_blk_fops。

struct file_operations def_blk_fops = {

open:           blkdev_open,

release:        blkdev_close,

llseek:         block_llseek,

read:           generic_file_read,

write:          generic_file_write,

mmap:           generic_file_mmap,

fsync:          block_fsync,

ioctl:          blkdev_ioctl,

裝置差異性

到這裡,又提出乙個問題:既然這樣,那裝置的差異化又該如何體現呢?在檔案系統層定義了檔案系統訪問裝置的方法,該方法就是

address_space_operations,檔案系統通過該方法可以訪問具體的裝置。對於字元裝置而言,沒有實現

address_space_operations方法,也沒有必要,因為字元裝置的介面與檔案系統的介面是一樣的,在字元裝置open操作的過程中,將

inode所指向的file_operations替換成cdev所指向的file_operations就可以了。這樣使用者層讀寫字元裝置可以直接呼叫

cdev中file_operations方法了。

[linux/fs.h]

*linux頁快取記憶體實用化address_space結構體描述頁快取記憶體中的頁面

*定義檔案在linux/fs.h中

struct address_space {

struct inode            *host;              /* 擁有節點 */

struct radix_tree_root  page_tree;          /* 包含全部頁面的radix樹 */

spinlock_t              tree_lock;          /* 保護page_tree的自旋鎖 */

unsigned int            i_mmap_writable;    /* vm_shared記數 */

struct prio_tree_root   i_mmap;             /* 似有對映鍊錶 */

struct list_head        i_mmap_nonlinear;   /* vm_nonlinear鍊錶 */

spinlock_t              i_mmap_lock;        /* 保護i_mmap的自旋鎖 */

atomic_t                truncate_count;     /* 截斷記數 */

unsigned long           nrpages;            /* 頁總數 */

pgoff_t                 writeback_index;    /* 回寫的起始偏移 */

struct address_space_operations   *a_ops;   /* 操作表*/

unsigned long           flags;              /* gfp_mask掩碼與錯誤標識 */

struct backing_dev_info *backing_dev_info;  /* 預讀資訊 */

spinlock_t              private_lock;       /* 私有address_space鎖 */

struct list_head        private_list;       /* 私有address_space鍊錶 */

struct address_space_operations {

int (*writepage)(struct page *, struct writeback_control *);

int (*readpage) (struct file *, struct page *);

int (*sync_page) (struct page *);

int (*writepages) (struct address_space *, struct writeback_control *);

int (*set_page_dirty) (struct page *);

int (*readpages) (struct file *, struct address_space *,

struct list_head *, unsigned);

int (*prepare_write) (struct file *, struct page *, unsigned, unsigned);

int (*commit_write) (struct file *, struct page *, unsigned, unsigned);

sector_t (*bmap)(struct address_space *, sector_t);

int (*invalidatepage) (struct page *, unsigned long);

int (*releasepage) (struct page *, int);

int (*direct_io) (int, struct kiocb *, const struct iovec *,

loff_t, unsigned long);

到這裡,是不是明白了linux的「裝置」也是檔案了呢?

快速上手Linux裝置驅動 之一切皆是檔案思想

只要用過linux的筒子,或者保守點說接觸到一些linux思想的同志肯定聽說過這樣一句話,在linux下,一切皆是檔案 不錯,今天walfred將在快速上手linux裝置驅動這一塊,談談linux的裝置也符合 一切皆是檔案 的思想在linux裝置驅動模型應用。如果你不理解linux裝置模型,請看下面...

Linux 一切皆檔案

一切皆是檔案 是 unix linux 的基本哲學之一 不僅普通的檔案,目錄 字元裝置 塊裝置 套接字等在 unix linux 中都是以檔案被對待 它們雖然型別不同,但是對其提供的卻是同一套操作介面。檔案本質就是一種抽象,一般是指對資料的一種抽象。同時,檔案 也表示資料的儲存組織形式。資料庫就是另...

Linux 一切皆檔案

啟動乙個程序,需要乙個程式檔案,這是乙個二進位制檔案。啟動的時候,要載入一些配置檔案,例如 yml properties 等,這是文字檔案 啟動之後會列印一些日誌,如果寫到硬碟上,也是文字檔案。但是如果我想把日誌列印到互動控制台上,在命令列上唰唰地列印出來,這其實也是乙個檔案,是標準輸出 stdou...