91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣進行Linux內核文件系統的分析

發布時間:2021-10-21 17:03:50 來源:億速云 閱讀:122 作者:柒染 欄目:云計算

怎樣進行Linux內核文件系統的分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

Linux內核存儲棧

  1. 總覽

內核存儲棧從上到下主要分為三層:1. VFS 2.Block layer 3.驅動

  1. 簡單介紹

這張圖來自https://blog.vmsplice.net/2020/04/how-linux-vfs-block-layer-and-device.html。主要介紹了內核中存儲棧幾個重要的數據結構之間的連接關系。VFS層數據結構struct block_device連接著快層數據結構struct gendisk。塊層接收到VFS的請求發送到request_queue,驅動最后會響應該請求,操作最后的物理設備。

怎樣進行Linux內核文件系統的分析

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。塊層和其他兩層沒有直接聯系,只是有驅動層注冊的回調函數。

  1. 詳細介紹

內核中的I/O流所經過的組件如下圖所示:

怎樣進行Linux內核文件系統的分析

這里列出一張內核中存儲棧中主要數據結構之間的關聯關系圖。

怎樣進行Linux內核文件系統的分析

這里追蹤一個從用戶空間出發的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內核文件系統的分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

论坛| 渭南市| 阳东县| 四川省| 开远市| 安西县| 晋宁县| 建宁县| 台中市| 孝昌县| 古浪县| 万载县| 双桥区| 彭泽县| 陇西县| 沁源县| 乌拉特中旗| 嘉兴市| 新和县| 若羌县| 陵川县| 凌源市| 连城县| 淮滨县| 孟州市| 肇庆市| 上饶县| 永吉县| 化隆| 阳谷县| 吉安县| 大余县| 金华市| 彭泽县| 健康| 成都市| 扎赉特旗| 临潭县| 康平县| 景泰县| 上思县|