Linux 0.11源碼閱讀筆記-塊設備驅動程式

来源:https://www.cnblogs.com/cwcheng/archive/2022/03/30/16079465.html
-Advertisement-
Play Games

內核代碼統一使用緩衝塊間接和塊設備(如磁碟)交換數據,緩衝區數據通過塊設備驅動程式和塊設備交換數據。 ...


塊設備驅動程式

塊設備驅動程式負責實現對塊設備數據的讀寫功能。內核代碼統一使用緩衝塊間接和塊設備(如磁碟)交換數據,緩衝區數據通過塊設備驅動程式和塊設備交換數據。

image

塊設備的管理

塊設備表

內核通過一張塊設備表blk_dev[]管理各種塊設備,每個表項對應一個塊設備,併為每一個塊設備維護一個請求隊列。

image

  • current_request:指向設備請求隊列第一個節點,請求隊列通過鏈表實現。
  • request_fn:函數指針,用於處理請求隊列裡面的讀寫請求。

設備請求隊列

內核為每個塊設備維護一個請求隊列,請求隊列中請求等待被處理,current_request指向設備請求隊列。

  • 請求項

用於描述請求操作,包含讀寫磁碟扇區位置信息、緩衝區地址信息、操作類別(讀/寫)信息等。

請求項數據結構:

image

  • 請求項數組

一塊連續記憶體,被分割為請求項大小的塊,形成數組,充當記憶體池的角色。請求隊列中的請求項的記憶體從請求項數組中進行分配,請求操作完成後,請求項會被釋放回該記憶體池中。

  • 請求隊列

處理讀寫設備請求時,從請求項數組中獲取一個空閑塊,建立請求項,並插入設備請求隊列中。

image

塊設備操作方式

在內核與塊設備進行數據交換(IO)時,涉及到三個對象之間的交互作用,其中主要需要瞭解系統和控制器之間的交互過程。

  • 系統(內核):內核可以向控制器發送命令(發出請求)或等待設備控制器發出中斷請求(完成請求)。
  • 控制器:完成讀寫操作後,向系統(CPU)發出中斷。
  • 驅動器:受設備控制器控制

image

寫數據過程

  1. 系統向控制器發出寫命令後,等待塊設備準備好接收數據,期間CPU需要主動查詢控制器的狀態寄存器判斷是否準備好接收數據(忙等待)。
  2. 控制器準備好後,CPU將數據寫入控制器的緩存中。(控制器具有一塊緩存)
  3. 控制器將緩存中的數據通過驅動器全部寫入塊設備。
  4. 向CPU發出中斷,中斷處理程式完成寫數據後的處理

讀數據過程

  1. 向控制器發出讀命令
  2. 控制器讀取磁碟數據到其緩存中
  3. 向系統發起中斷,中斷處理程式從控制器緩存中取走數據

請求隊列處理過程

ll_rw_block函數將請求放入塊設備請求隊列,設備中斷處理程式會不斷處理請求隊列,直到隊列為空。

  • 寫請求的處理過程
  1. ll_rw_block為寫請求建立請求項,並插入設備的請求隊列。若插入前隊列為空,則調用請求項操作函數(request_fn)處理當前寫請求,對塊設備進行寫操作。

  2. 設備塊設備完成一個寫請求後,向CPU發出中斷信號,CPU運行中斷處理函數。

  3. 中斷處理程式判斷是否還有數據要寫(一個請求會可能寫多個扇區),如果有則繼續寫,然後等待下一次中斷,這一過程重覆直到該寫請求數據全部寫入設備。

  4. 完成數據寫之後,中斷處理程式將喚醒一些等待進程

    • 喚醒等待該請求項有關數據的相關進程
    • 喚醒等待請求項的進程(當記憶體池沒有空閑請求項時,將導致某些請求讀寫的進程睡眠)
    • 釋放當前請求項並從鏈表中刪除該請求項以及釋放鎖定的相關緩衝區。
  5. 喚醒等待進程後,中斷處理程式將調用請求項操作函數處理下一個讀/寫請求

  • 讀請求處理過程

與寫請求處理過程類似

  • ll_rw_block與中斷處理程式

ll_rw_block,負責將讀寫請求放入隊列中,並啟動對請求隊列的處理。

中斷處理程式,設備完成讀寫操作後,發出中斷,不斷處理請求隊列中的請求操作,直到請求隊列為空。

相關知識

  • I/O調度演算法,讀寫請求不是按訪問順序放入請求隊列的,0.11內核使用電梯演算法調度讀寫請求

總結

  • 每個塊設備具有一個請求隊列,對塊設備的讀寫請求被插入到隊列中。
  • 中斷處理程式不斷處理請求隊列中的請求,直到隊列為空。完成某個請求後,會喚醒一些等待的進程。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 程式的異常:Throwable * 嚴重問題:Error 我們不處理。這種問題一般都是很嚴重的,比如說記憶體溢出。 * 問題:Exception * A:編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。 * B:運行期問題:RuntimeExcep ...
  • 一、前言 掃描件一直受大眾青睞,任何紙質資料在掃描之後進行存檔,想使用時手機就能打開,省心省力。但是掃描件的優點也恰恰造成了它的一個缺點,因為是通過電子設備掃描,所以出來的是圖像,如果想要處理文件上的內容,直接操作是無法實現的。 那要是想要引用其中的內容怎麼辦呢?別擔心,Python幫你解決問題。 ...
  • 一、序言 Spring Cache是Spring體系下標準化緩存框架。Spring Cache有如下優勢: 緩存品種多 支持緩存品種多,常見緩存Redis、EhCache、Caffeine均支持。它們之間既能獨立使用,也能組合使用。 平滑遷移 Spring內部支持的緩存,可實現無縫平滑遷移,無需修改 ...
  • 首先 相信有很多小伙伴都喜歡玩抖音吧,最近抖音張同學突然火了,兩個月漲粉一千多萬。看了他的視頻,滿滿的生活氣息,讓人有一種家的感覺。這就讓我很感興趣了,必須得用Python對他分析一下。 今天這篇文章,我抓取了張同學的視頻的評論數據,想從文本分析的角度,挖掘一下大家對張同學感興趣的點。 張同學 10 ...
  • 內容概要 web 開發模式 API 介面 postman 測試軟體的使用 restful 規範 drf 的安裝與使用 cbv 的 View 源碼分析 APIView 源碼分析 drf 的 Request 類 drf 的 APIView 類執行過程 內容詳細 web 開發模式 1、前後端不分離 在開發 ...
  • Nacos作為配置中心,必然需要保證服務節點的高可用性,那麼Nacos是如何實現集群的呢? 下麵這個圖,表示Nacos集群的部署圖。 Nacos集群工作原理 Nacos作為配置中心的集群結構中,是一種無中心化節點的設計,由於沒有主從節點,也沒有選舉機制,所以為了能夠實現熱備,就需要增加虛擬IP(VI ...
  • 一 概述 GEM標准定義了通信鏈路上的半導體設備的行為。 SECS-II標准定義了在主機和設備之間交換的消息和相關數據項。GEM標準則定義了在哪種情況下應該使用哪些SECS-II消息以及由此產生的結果行為。圖1.1說明瞭GEM、SECS-II和其他通信替代方案之間的關係。 GEM為所有半導體設備定義 ...
  • Paint in 3D Paint in 3D用於在游戲內和編輯器里繪製所有物體。所有功能已經過深度優化,在WebGL、移動端、VR 以及更多平臺用起來都非常好用! 它支持標準管線,以及 LWRP、HDRP 和 URP。通過使用GPU 加速,你的物體將以難以置信的速度被繪製。代碼還經過深度優化來防止 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...