在系統上電的時候,BIOS/UEFI負責檢測并初始化重定向硬體(即VT-d硬體),為其配置設定相應的實體位址,并且以ACPI表中的DMAR(DMA Remapping Reporting)表的形式告知VT-d硬體的存在。
DMAR的格式如下所示,先是标準的APCI表的表頭,然後是Host Address Width表示該系統中支援的實體位址寬度;标志位元組Flag表示VT-d硬體支援的一些功能,最後是Remapping Structures,即一堆有組織的結構體用來描述VT-d硬體的功能。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9E0T3FkaNBnVIFGaS1mYwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxQTMwEjMyUTM0ITMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
Remapping Structures是一堆以Type和Length為開始的結構體,Type的類型可能有下面五種:
BIOS/UEFI負責在初始化系統的時候将這些結構體以類型為順序有序地組織起來(同種類型的結構體可能有多個,也可能壓根就不存在)。第一個結構體必須是DRHD(DMA Remapping Hardware Unit Definition)結構體。
1. DRHD(DMA Remapping Hardware Unit Definition)表
一個DMAR結構體用于唯一定義系統中存在的一個VT-d重定向硬體。其結構體如下所示:
主要包括兩方面的資訊,一是提供VT-d重定向硬體寄存器基位址,為系統軟體通路VT-d硬體寄存器提供入口(各個偏移量所指向的具體寄存器在VT-d的spec中有詳細的約定,即VT-d硬體的具體實作);另一個是該VT-d重定向硬體所管轄的硬體,由Segment Number和Device Scope兩個區域來定義。Device Scope結構體由Device Scope Entry組成,每個Device Scope Entry可以用來指明一個PCI endpoint device,一個PCI sub-hierarchy,或者其他裝置,如I/O xAPIC或者HPET。
2. RMRR(Reserved Memory Region Reporting)表
RMRR表用于表示BIOS或者UEFI為了DMA的使用而保留的一些系統實體記憶體,這些記憶體從作業系統的角度來看其屬性為Reserved Memory,因為有一些比較傳統的裝置(比如USB、UMA顯示卡等)可能會需要用到一些固定的,或者專用的系統記憶體,這時候就需要BIOS或UEFI為其保留。
該表中,主要包括兩方面資訊,即保留的記憶體的範圍(Reserved Memory Region Base Address和Reserved Memory Region Limit Address)和針對的實體裝置(Segment Number和Device Scope)。
3. ATSR(Root Port ATS Capability Reporting)表
ATS是Address Translation Services的意思,它是PCIe Capability的一種,用于表示PCIe裝置是否支援經過PCIe Root Port翻譯過的位址。ATSR表隻适用于那種PCIe裝置支援Device-TLB的系統中,即PCIe裝置帶有位址轉換加速功能。一個ATSR表表示一個支援ATS功能的PCIe Root-Port,其結構如下所示:
主要包括兩方面資訊:Segment Number用于定位PCIe Root-Port;Device Scope用于定位位于該PCIe Root-Port下面的裝置。
4. RHSA(Remapping Hardware Status Affinity)表
RHSR表适用于NUMA(Non-Uniform Memory)系統(即不同的CPU Socket都可能會單獨連接配接一些記憶體條,不同的CPU Socket對同一實體記憶體的通路路徑可能是不同的),并且系統中的VT-d重定向硬體分布于不同的Node上。該表用于表示VT-d重定向硬體從屬于哪個Domain。
5. ANDD(ACPI Name-space Device Declaration)表
一個ANDD表用于表示一個以ACPI name-space規則命名,并且可發出DMA請求的裝置。ANDD可以和前面提到的Device Scope Entry結合一起時候。
其中ACPI Device Number,相當于在該VT-d硬體管轄範圍内的以ACPI name-space規則命名的硬體ID号,前面Device Scope Entry值需要這個ID号,就可以找到該ANDD表,并從該表的ACPI Object Name區域找到具體的裝置。
歡迎關注同名微信公衆号“河馬虛拟化”第一時間擷取最新文章。