簡單分析mmc體系結構

2021-09-10 04:21:41 字數 1670 閱讀 5463

可以看到有三條並行的路,且這三路剛好對應著mmc軟體主體框架(其實硬體框架也是這樣的,畢竟軟體是硬體的抽象)

1.mmc子系統位於第一路它註冊乙個mmc_bus供card drv和card dev匹配。

2.host driver位於第二路它申請、初始化、新增host結構體(未來將用這個結構體和sd**信)。然後檢測下sd卡(檢測不到只能等熱插拔了),檢測到後新增乙個card device。

3.card driver位於第三路它直接面對應用層並提供乙個名字為mmc的card driver。

4.如果card driver和card device成功匹配後(mmc_bus下的match方法)就執行host driver下的probe並提供乙個信標:mmc_blk_issue_rq**用層呼叫。

看完上面tiny版的mmc框架,接下來看下博主整理的mmc體系架構。之前博主一般都是貼原始碼呼叫過程分析框架的,不過我發現過一段時間不看原始碼,我自己也忘記**的呼叫關係0_0。

所以,博主現在除了分析原始碼呼叫關係外,還以圖的形式分析元件關係,因為以圖的形式會更形象、生動、不易忘記。

請先看三塊藍色大字

1.從rk mmc控制器驅動出發,可以大概知道構建rk mmc host需要的核心元件。像裝置樹、時鐘、timer、tasklet、dma等等

2.從mmc核心層驅動出發可以,大概知道構建mmc核心層需要sysfs、電源管理、記憶體管理、idr機制、生成mmc_bus、card device。

3.從mmc驅動層出發,可以大概知道構建mmc驅動層需要自身新增的card driver和card device匹配並向mmc 核心層申請、設定、註冊乙個disk。提供issue函式以支援應用層對sd卡的操作。

看到乙個驅動牽連這麼多元件(子系統)是不是覺得linux驅動是入門linux核心的最好方向呢?

先看乙個塊裝置請求mmc主機控制器操作一筆資料簡圖

塊裝置的資料傳輸,本質上是裝置上相鄰扇區與記憶體之間的資料傳輸。通常情況,為了提公升效能,資料傳輸通過dma方式。

在磁碟控制器的舊時代,dma操作都比較簡單,每次傳輸,資料在記憶體中必須是連續的。現在則不同,很多soc都支援「分散/聚合」(scatter-gather)dma操作,這種操作模式下,資料傳輸可以在多個非連續的記憶體區域中進行。

對於每個「分散/聚合」dma操作,塊裝置驅動需要向控制器傳送: 

a)初始扇區號和傳輸的總共扇區數 

b)記憶體區域的描述鍊錶,每個描述都包含乙個位址和長度。不同的描述之間,可以是乙個記憶體上實體地址連續的,也可以不連續的。

控制器來管理整個資料傳輸,例如:在讀操作中,控制器從塊裝置相鄰的扇區上讀取資料,然後將資料分散儲存在記憶體的不同區域。

這裡的每個記憶體區域(物理連續的一段記憶體,可以是乙個page,也可以是page的一部分)就稱作segment。乙個segment包含多個相鄰扇區。最後,利用「分散/聚合」的dma操作,一次資料傳輸可以會涉及多個segments。

分享一些不錯的學習**

mmc協議

ClearQuest體系結構分析

關鍵字clearquest 體系結構分析 clearquest是按照標準的三層結構設計的,包括資料層 功能層 業務層 表示層。下面分別說明三層的構造和相互的關係。clearquest的根本在資料庫,所有的內容都儲存在資料庫中。在使用cq資料庫的時候,一定要記住一點 必須先建立空白的資料庫再進行cq的...

OpenLayers分析 (十二)體系結構

以前做的一些openlayers的分析,又整理了一下 以前弄的沒有顯示,現在基本可以了,發上來,如果有需要了解的朋友可以瞅瞅。寫的不好,請大家原諒了,呵呵 一般來說,我們了解乙個事物,先是從輪廓 外觀結構去認識,然後再從內部更細部的去 拿做軟體 來說吧 就比如openlayers 先是在文件設計它的...

mysql 體系結構 了解MySQL體系結構

mysql 資料庫體系結構圖 mysql 由以下幾部分組成 1 connectors 不同語言中與 sql 的互動 show variables like connection variable name value character set connection utf8 collation c...