歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux IO子系統和文件系統讀寫流程

Linux IO子系統和文件系統讀寫流程

日期:2017/2/28 16:02:44   编辑:Linux教程

我們所有分析的,是基於2.6.32及其後的內核.

我們在Linux上總是要保存數據,數據要麼保存在文件系統裡(如ext3),要麼就保存在裸設備裡。我們在使用這些數據的時候都是通過文件這個抽象來訪問的,操作系統會把我們需要的數據提交給我們,而我們則無需和塊設備打交道。

從下圖,我們可以清除的看到:

I/O子系統是個層次很深的系統,數據請求從用戶空間最終到達磁盤,經過了復雜的數據流動。

對設驅開發人員或與此相關的設計人員,特別是IO很密集,我們就需要搞清楚IO具體是如何動作的,免得濫用IO和導致設計問題。(http://blog.yufeng.info/archives/751)


IBM developworks中,〈read系統調用剖析〉闡述就很清楚。

read系統調用的處理分為用戶空間和內核空間處理兩部分。其中,用戶空間處理只是通過0x80中斷陷入內核,接著調用其中斷服務例程,即sys_read以進入內核處理流程。

對於read系統調用在內核的處理,如上圖所述,經過了VFS、具體文件系統,如ext2、頁高速緩沖存層、通用塊層、IO調度層、設備驅動層、和設備層。其中,VFS主要是用來屏蔽下層具體文件系統操作的差異,對上提供一個統一接口,正是因為有了這個層次,所以可以把設備抽象成文件。具體文件系統,則定義了自己的塊大小、操作集合等。引入cache層的目的,是為了提高IO效率。它緩存了磁盤上的部分數據,當請求到達時,如果在cache中存在該數據且是最新的,則直接將其傳遞給用戶程序,免除了對底層磁盤的操作。通用塊層的主要工作是,接收上層發出的磁盤請求,並最終發出IO請求(BIO)。IO調度層則試圖根據設置好的調度算法對通用塊層的bio請求合並和排序,回調驅動層提供的請求處理函數,以處理具體的IO請求。驅動層的驅動程序對應具體的物理設備,它從上層取出IO請求,並根據該IO請求中指定的信息,通過向具體塊設備的設備控制器發送命令的方式,來操縱設備傳輸數據。設備層都是具體的物理設備。

VFS層:

內核函數sys_read是read系統調用在該層的入口點。

它根據文件fd指定的索引,從當前進程描述符中取出相應的file對象,並調用vfs_read執行文件讀取操作。

vfs_read會調用與具體文件相關的read函數執行讀取操作,file->f_op.read。

然後,VFS將控制權交給了ext2文件系統。(ext2在此作為示例,進行解析)

Copyright © Linux教程網 All Rights Reserved