1. <wbr id="cnjas"><legend id="cnjas"></legend></wbr>

          Linux培訓
          達內IT學院

          400-111-8989

          Linux iommu和vfio概念空間解構

          • 發布:Linux培訓
          • 來源:網絡
          • 時間:2017-05-22 16:13

          最近和一些硬件和相關驅動設計的同學討論SMMU的設計需求,雙方討論的空間不太一致,我寫一個文檔澄清一下這些概念。

          (不熟悉SMMU的同學可以跳過這一段,后面我會單獨解釋概念的)我們首先得厘清兩個概念,當我們說SMMU的時候,硬件設計同學心中是那個進行設備地址翻譯,做DMA操作的那個硬件。軟件驅動同學心中是那個控制SMMU硬件的那個軟件。你們之間唯一的接口是:中斷,配置空間和內存,沒有其他了。所以,當我們討論這個問題的時候,一定首先分清楚對方在說的是哪個概念空間的概念,因為兩者是不一樣的。硬件的同學說“設備發出的VA”,包括Substream ID和軟件指配給它VA地址,這個地址遠遠比64位長。但軟件指配地址的時候,可不認為自己發出了Substream ID的。實際上,Substream ID很多時候是ASID(或者說PASID,后者是PCIE的概念),但對軟件來說,ASID有特定的含義,把ASID作為Substream ID,那是硬件自己的決定,不是全系統的共識。

          本文要討論的是軟件的概念空間,所以,我們先抽象一下硬件的模型:

          SMMU的作用是把CPU提交給設備的VA地址(軟件概念的VA),直接作為設備發出的地址,變成正確的物理地址,訪問到物理內存上。

          MMU通過頁表完成這個翻譯,SMMU也一樣,但SMMU的頁表比MMU復雜得多,這受兩個要素限制:

          第一,一個SMMU控制器可能有多個設備連著,兩個設備互相之間可能不會復用同一個頁表,需要區分。SMMU用stream id來做這個區分

          第二,一個設備可能被多個進程使用,兩個進程有兩個頁表,這個設備需要進行區分。SMMU通過substream id來進行區分

          這樣,設備發出一個地址請求,它的地址就包括stream id, substream id和VA三個部分。前兩者定位一個類似MMU的頁表體系,后者的執行一個類似MMU的翻譯過程。

          要SMMU硬件正確動作,就需要CPU(就是軟件了)給它提供正確的信息,用我以前提過的DFD方法就可以把對應數據模型的充要性建立出來:

          至于很多人想引入到這個模型的“虛擬化”的概念,我認為你急了,虛擬化的概念在MMU的頁表翻譯機制中是自恰的,根本沒有必要引入到這里來。無論你用ARM的VA->IPA->PA的兩級翻譯,還是Intel的GVA->GPA->HVA->HPA的三級翻譯,都和這層建模無關。

          好了,現在輪到軟件。軟件的概念空間就比這個概念復雜得多了,這是因為軟件要扭合多個硬件平臺的意見,有人DMA是64位的,但還有人是32位的啊。而且,軟件是有版本概念的,每個版本都和原來有偏離(我這里用主線Linux內核4.11來作為分析對象),而且都有多個硬件廠商的角力,我們不但要看到現在如何,還要看到未來的走向。

          我們先拋開VFIO,先建立iommu的概念空間:

          在Linux的概念空間中,硬件的設備,用device來代表。設備用總線類型bus_type來區分。比如眾所皆知的pci_device,或者沒爹沒娘的platform_device。smmu控制器,本身是一種device,對于ARM來說,它現在是一種平臺設備。不同總線有什么設備,可以從/sys/bus/<bus>/devices/目錄中全部列出來。

          bus_type說明的是發現設備的方法,不表明設備的功能,設備的功能用class來表達,/sys/class列出了從功能角度對設備的表達。從這個角度來收,smmu是一種iommu class的設備(之所以不叫smmu而叫iommu,因為intel先上的主線,所以用intel的名字,現在開源,主要是搶名稱空間,因為名稱空間意味著整個行業為誰服務)

          所以我們現在有了device和iommu兩個概念了。下一步是device和iommu的關聯,從硬件的邏輯空間,應該是每個device有一個指向iommu的指針,但如果軟件也這樣做,就掩蓋了一個事實:如果兩個設備共享同一個streamid,那么修改其中一個設備的頁表體系,也就相當于修改了另一個設備的頁表體系。所以,修改頁表的最小單位不是設備,而是stream id。為此,Linux的模型是增加一個iommu_group的概念,iommu_group代表共享同一個streamid的一組device(表述在/sys/kernel/iommu_group中)。

          所以,整個概念空間就是:

          SMMU控制器自身的發現:總線掃描發現設備(device)(ARM是平臺設備),設備匹配SMMU驅動(ARM現在是drivers/iommu/arm-smmu*.c),SMMU驅動probe的時候給自己支持的總線設置bus->iommu_ops,讓總線具有了iommu attach的能力。

          設備的SMMU關聯:總線掃描發現了一般的設備,總線的發現流程負責調用iommu_ops給這個設備加上iommu_group,然后讓iommu_group指向對應的iommu控制器。

          這個過程實際要求SMMU驅動認識設備的SMMU Topo,很明顯這個Topo是硬件設計的結果,要不是硬件提供自動發現機制(例如PCIE),要不就只能在固件中描述(比如DTS或者ACPI),這個固件,稱為iommu_fwspec,屬于device,在device發現的時候就可以生成。

          這樣整個框架的模型就是這樣的:

          IOMMU的整個框架,首先提供的是針對設備的DMA能力,也就是說,當我們發起dma_map的時候,設備定位的streamid,進程定位了substreamid(這個概念是iommu_device通過iommu_domain種入),VA送下來的時候,從設備定位group,group匹配的iommu_device,device決定了iommu_domain,驅動就可以綜合全部的信息寫到SMMU硬件中了。

          然后我們看VFIO。

          VFIO的目的(從SMMU的角度來說)是把設備的DMA能力直接暴露到用戶態。todo: 太晚了,明天接著來。

          todo:還要做一次全局的概念對照和整理。

          預約申請免費試聽課

          填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

          上一篇:linux大拿淺談linux系統學習技巧
          下一篇:告訴你們!我是怎么與Linux系統觸電的!

          拯救者Linux:我是如何給我的團隊引入Linux的

          Linux只有十三個字符的經典Fork炸彈

          騰訊十年運維老兵:運維團隊的五個“殺手锏”

          為您的Linux應用開發加油提速(二)

          • 掃碼領取資料

            回復關鍵字:視頻資料

            免費領取 達內課程視頻學習資料

          • 視頻學習QQ群

            添加QQ群:1143617948

            免費領取達內課程視頻學習資料

          Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

          選擇城市和中心
          黑龍江省

          吉林省

          河北省

          湖南省

          貴州省

          云南省

          廣西省

          海南省

          欧美做爰视频免费播放_做暖全过程免费的视频_性爱免费视频 百度 好搜 搜狗
          <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>