您好,登錄后才能下訂單哦!
怎樣進行Linux內核文件系統的分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
內核存儲棧從上到下主要分為三層:1. VFS 2.Block layer 3.驅動
這張圖來自https://blog.vmsplice.net/2020/04/how-linux-vfs-block-layer-and-device.html。主要介紹了內核中存儲棧幾個重要的數據結構之間的連接關系。VFS層數據結構struct block_device連接著快層數據結構struct gendisk。塊層接收到VFS的請求發送到request_queue,驅動最后會響應該請求,操作最后的物理設備。
2.1 VFS層
VFS為不同的底層文件系統(ext4,XFS,NFS等)提供了一個接口層。
open,read等系統調用由VFS處理,然后分發給相應struct file_operations的處理函數。
塊設備使用struct block_device表示,VFS層數據結構。struct block_device使用塊層數據結構struct gendisk和struct request_queue連接VFS inode和struct file_operations接口。
block device nodes如/dev/sda在fs/block_dev.c中實現,提供了橋的作用,連接VFS和Linux block layer。塊層處理實際的IO請求,并且知道磁盤的特定信息,如磁盤容量,塊大小等。
2.2 Block layer層
每一個磁盤使用數據結構struct gendisk表示,struct hd_struct表示磁盤分區。
總是存在part0分區,表示整個磁盤
IO請求隊列使用struct request_queue表示
2.3 驅動層
磁盤設備驅動程序向塊層注冊struct genhd,并設置struct request_queue以接收需要提交給物理設備的請求。
即使用戶空間可能為磁盤上的多個分區打開struct block_device實例,整個設備也只有一個struct genhd。
驅動層看不到磁盤分區,因為IO請求已經根據分區的起始位置偏移做了邏輯地址的調整處理
VFS連接著塊層struct gendisk。設備驅動連接著塊層和VFS層struct block_device。塊層和其他兩層沒有直接聯系,只是有驅動層注冊的回調函數。
內核中的I/O流所經過的組件如下圖所示:
這里列出一張內核中存儲棧中主要數據結構之間的關聯關系圖。
這里追蹤一個從用戶空間出發的read函數調用的數據流,來分析從內核到驅動最終到物理設備硬件的過程。
3.1 內核執行系統調用sys_read響應用戶空間的read操作。
3.2 在VFS層調用vfs_read通用的文件系統read接口。這里會根據具體的文件系統類型調用相應的read函數。
3.3 這里以ext4文件系統為例。會執行ext4_file_read_iter。
3.4 VFS層最主要的數據結構式bio,它定義的一系列對文件操作的具體行為。在構造了相應的bio數據結構后,會調用ext4_file_read_iter將請求提交到塊層。
3.5 塊層收到請求后會根據文件系統是否有定義自己的submit_bio函數來調用自定義函數還是通用submit_bio。ext4文件系統調用的是通用submit_bio。
3.6 塊層對于VFS的請求不會直接提交到設備驅動去執行。而是會做合并的延遲處理,因為在物理磁盤上的尋到處理是十分耗時的操作。對于可以與請求隊列中的請求進行合并的操作,會首先進行合并。否則會插入請求隊列中。內核對于I/O調度有多種不同的算法:1.電梯調度 2. 最后期限算法 3. CFQ完全公平隊列算法 4.預期算法 5.No Operations算法。
3.7 最后會調用驅動的queue_rq方法,將請求發送給驅動程序。不同的驅動會注冊不同的queue_rq方法。這里以iscsi驅動程序為例。調用執行scsi_queue_rq方法。
3.8 scsi_queue_rq會構造請求cmd,然后調用scsi_dispatch_cmd,分發cmd到底層驅動。
3.9 之后根據不同的底層設備類型,調用相應的queuecommand函數執行cmd命令。
內核的存儲棧中,塊層起著承上啟下的作用。北向承接VFS的發送過來的IO請求,南向對接設備驅動程序,提交請求到設備驅動。這當中比較重要的幾個點是:1. 塊層對于I/O請求的合并優化處理。這塊對于I/O的性能的影響巨大。2. 對于頁高速緩存的處理。設計到如何將磁盤數據導入到內存,以及inode等數據結構如何操作訪問頁數據。對于很多細節好有待分析。
看完上述內容,你們掌握怎樣進行Linux內核文件系統的分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。