新聞中心
怎樣進(jìn)行Linux內(nèi)核文件系統(tǒng)的分析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
成都創(chuàng)新互聯(lián)公司主要業(yè)務(wù)有網(wǎng)站營(yíng)銷(xiāo)策劃、網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、微信小程序開(kāi)發(fā)、H5頁(yè)面制作、程序開(kāi)發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶(hù)當(dāng)客戶(hù),還把客戶(hù)視為我們的合作伙伴,在開(kāi)展業(yè)務(wù)的過(guò)程中,公司還積累了豐富的行業(yè)經(jīng)驗(yàn)、全網(wǎng)整合營(yíng)銷(xiāo)推廣資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶(hù)服務(wù)和保障體系。
Linux內(nèi)核存儲(chǔ)棧
總覽
內(nèi)核存儲(chǔ)棧從上到下主要分為三層:1. VFS 2.Block layer 3.驅(qū)動(dòng)
簡(jiǎn)單介紹
這張圖來(lái)自https://blog.vmsplice.net/2020/04/how-linux-vfs-block-layer-and-device.html。主要介紹了內(nèi)核中存儲(chǔ)棧幾個(gè)重要的數(shù)據(jù)結(jié)構(gòu)之間的連接關(guān)系。VFS層數(shù)據(jù)結(jié)構(gòu)struct block_device連接著快層數(shù)據(jù)結(jié)構(gòu)struct gendisk。塊層接收到VFS的請(qǐng)求發(fā)送到request_queue,驅(qū)動(dòng)最后會(huì)響應(yīng)該請(qǐng)求,操作最后的物理設(shè)備。
2.1 VFS層
VFS為不同的底層文件系統(tǒng)(ext4,XFS,NFS等)提供了一個(gè)接口層。
open,read等系統(tǒng)調(diào)用由VFS處理,然后分發(fā)給相應(yīng)struct file_operations的處理函數(shù)。
塊設(shè)備使用struct block_device表示,VFS層數(shù)據(jù)結(jié)構(gòu)。struct block_device使用塊層數(shù)據(jù)結(jié)構(gòu)struct gendisk和struct request_queue連接VFS inode和struct file_operations接口。
block device nodes如/dev/sda在fs/block_dev.c中實(shí)現(xiàn),提供了橋的作用,連接VFS和Linux block layer。塊層處理實(shí)際的IO請(qǐng)求,并且知道磁盤(pán)的特定信息,如磁盤(pán)容量,塊大小等。
2.2 Block layer層
每一個(gè)磁盤(pán)使用數(shù)據(jù)結(jié)構(gòu)struct gendisk表示,struct hd_struct表示磁盤(pán)分區(qū)。
總是存在part0分區(qū),表示整個(gè)磁盤(pán)
IO請(qǐng)求隊(duì)列使用struct request_queue表示
2.3 驅(qū)動(dòng)層
磁盤(pán)設(shè)備驅(qū)動(dòng)程序向塊層注冊(cè)struct genhd,并設(shè)置struct request_queue以接收需要提交給物理設(shè)備的請(qǐng)求。
即使用戶(hù)空間可能為磁盤(pán)上的多個(gè)分區(qū)打開(kāi)struct block_device實(shí)例,整個(gè)設(shè)備也只有一個(gè)struct genhd。
驅(qū)動(dòng)層看不到磁盤(pán)分區(qū),因?yàn)镮O請(qǐng)求已經(jīng)根據(jù)分區(qū)的起始位置偏移做了邏輯地址的調(diào)整處理
VFS連接著塊層struct gendisk。設(shè)備驅(qū)動(dòng)連接著塊層和VFS層struct block_device。塊層和其他兩層沒(méi)有直接聯(lián)系,只是有驅(qū)動(dòng)層注冊(cè)的回調(diào)函數(shù)。
詳細(xì)介紹
內(nèi)核中的I/O流所經(jīng)過(guò)的組件如下圖所示:
這里列出一張內(nèi)核中存儲(chǔ)棧中主要數(shù)據(jù)結(jié)構(gòu)之間的關(guān)聯(lián)關(guān)系圖。
這里追蹤一個(gè)從用戶(hù)空間出發(fā)的read函數(shù)調(diào)用的數(shù)據(jù)流,來(lái)分析從內(nèi)核到驅(qū)動(dòng)最終到物理設(shè)備硬件的過(guò)程。
3.1 內(nèi)核執(zhí)行系統(tǒng)調(diào)用sys_read響應(yīng)用戶(hù)空間的read操作。
3.2 在VFS層調(diào)用vfs_read通用的文件系統(tǒng)read接口。這里會(huì)根據(jù)具體的文件系統(tǒng)類(lèi)型調(diào)用相應(yīng)的read函數(shù)。
3.3 這里以ext4文件系統(tǒng)為例。會(huì)執(zhí)行ext4_file_read_iter。
3.4 VFS層最主要的數(shù)據(jù)結(jié)構(gòu)式bio,它定義的一系列對(duì)文件操作的具體行為。在構(gòu)造了相應(yīng)的bio數(shù)據(jù)結(jié)構(gòu)后,會(huì)調(diào)用ext4_file_read_iter將請(qǐng)求提交到塊層。
3.5 塊層收到請(qǐng)求后會(huì)根據(jù)文件系統(tǒng)是否有定義自己的submit_bio函數(shù)來(lái)調(diào)用自定義函數(shù)還是通用submit_bio。ext4文件系統(tǒng)調(diào)用的是通用submit_bio。
3.6 塊層對(duì)于VFS的請(qǐng)求不會(huì)直接提交到設(shè)備驅(qū)動(dòng)去執(zhí)行。而是會(huì)做合并的延遲處理,因?yàn)樵谖锢泶疟P(pán)上的尋到處理是十分耗時(shí)的操作。對(duì)于可以與請(qǐng)求隊(duì)列中的請(qǐng)求進(jìn)行合并的操作,會(huì)首先進(jìn)行合并。否則會(huì)插入請(qǐng)求隊(duì)列中。內(nèi)核對(duì)于I/O調(diào)度有多種不同的算法:1.電梯調(diào)度 2. 最后期限算法 3. CFQ完全公平隊(duì)列算法 4.預(yù)期算法 5.No Operations算法。
3.7 最后會(huì)調(diào)用驅(qū)動(dòng)的queue_rq方法,將請(qǐng)求發(fā)送給驅(qū)動(dòng)程序。不同的驅(qū)動(dòng)會(huì)注冊(cè)不同的queue_rq方法。這里以iscsi驅(qū)動(dòng)程序?yàn)槔U{(diào)用執(zhí)行scsi_queue_rq方法。
3.8 scsi_queue_rq會(huì)構(gòu)造請(qǐng)求cmd,然后調(diào)用scsi_dispatch_cmd,分發(fā)cmd到底層驅(qū)動(dòng)。
3.9 之后根據(jù)不同的底層設(shè)備類(lèi)型,調(diào)用相應(yīng)的queuecommand函數(shù)執(zhí)行cmd命令。
內(nèi)核的存儲(chǔ)棧中,塊層起著承上啟下的作用。北向承接VFS的發(fā)送過(guò)來(lái)的IO請(qǐng)求,南向?qū)釉O(shè)備驅(qū)動(dòng)程序,提交請(qǐng)求到設(shè)備驅(qū)動(dòng)。這當(dāng)中比較重要的幾個(gè)點(diǎn)是:1. 塊層對(duì)于I/O請(qǐng)求的合并優(yōu)化處理。這塊對(duì)于I/O的性能的影響巨大。2. 對(duì)于頁(yè)高速緩存的處理。設(shè)計(jì)到如何將磁盤(pán)數(shù)據(jù)導(dǎo)入到內(nèi)存,以及inode等數(shù)據(jù)結(jié)構(gòu)如何操作訪問(wèn)頁(yè)數(shù)據(jù)。對(duì)于很多細(xì)節(jié)好有待分析。
看完上述內(nèi)容,你們掌握怎樣進(jìn)行Linux內(nèi)核文件系統(tǒng)的分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章題目:怎樣進(jìn)行Linux內(nèi)核文件系統(tǒng)的分析
網(wǎng)頁(yè)地址:http://www.ef60e0e.cn/article/jiedci.html