設(shè)備直通的實現(xiàn)大致分為四個部分,分別是直通設(shè)備發(fā)現(xiàn),虛擬PCI配置空間,中斷重映射,DMA重映射。

## 直通設(shè)備發(fā)現(xiàn)

### 如何讓虛擬機發(fā)現(xiàn)直通設(shè)備

操作系統(tǒng)初始化時會" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 虛擬化中設(shè)備直通的實現(xiàn)

虛擬化中設(shè)備直通的實現(xiàn)

時間:2023-06-25 16:18:01 | 來源:網(wǎng)站運營

時間:2023-06-25 16:18:01 來源:網(wǎng)站運營

虛擬化中設(shè)備直通的實現(xiàn):# 虛擬化中設(shè)備直通的實現(xiàn)

設(shè)備直通的實現(xiàn)大致分為四個部分,分別是直通設(shè)備發(fā)現(xiàn),虛擬PCI配置空間,中斷重映射,DMA重映射。

## 直通設(shè)備發(fā)現(xiàn)

### 如何讓虛擬機發(fā)現(xiàn)直通設(shè)備

操作系統(tǒng)初始化時會進行PCI設(shè)備的設(shè)備枚舉,設(shè)備枚舉從根節(jié)點HOST-PCI橋(Header Type為1的PCI設(shè)備),首先探測總線0上的各個設(shè)備。每當(dāng)發(fā)現(xiàn)一個橋設(shè)備,當(dāng)將它為根節(jié)點往下探測,如此反復(fù)直到所有設(shè)備都被探測完畢。

探測的方法很直接,從0到PCI_SLOTMAX枚舉device number,再結(jié)合所在總線的bus number與默認(rèn)的function number(0)組合成bdf,通過將bdf寫入CONFIG_ADDRESS(0xcf8端口),然后向CONFIG_DATA中寫入值便可以讀該個PCI插槽上的PCI設(shè)備。通過讀取PCI設(shè)備"Vendor ID"和"Device ID"能夠知道這個PCI設(shè)備是否存在。如果發(fā)現(xiàn)該設(shè)備一個PCI-PCI橋,則創(chuàng)建一個pci_bus數(shù)據(jù)結(jié)構(gòu)并且連入到由pci_root_buses指向的pci_bus和pci_dev數(shù)據(jù)結(jié)構(gòu)組成的樹中。

### 直通設(shè)備發(fā)現(xiàn)的關(guān)鍵步驟

#### 截獲操作系統(tǒng)對PCI總線的訪問(CONFIG_ADDRESS,DATA_ADDRESS)

HV將0xcf8端口與0xcfc端口從VMCS中的IO位圖中關(guān)閉,操作系統(tǒng)對這兩個端口的訪問將下陷到hypervisor中。

#### 將直通設(shè)備記錄在pci_vdevs數(shù)組中

HV需要對每個虛擬機模擬對應(yīng)的PCI總線,記錄當(dāng)前給虛擬機模擬的PCI設(shè)備,當(dāng)給UOS assign一個直通設(shè)備時,需要給這個設(shè)備建立一個vdev結(jié)構(gòu)體,并將其加入到UOS對應(yīng)的pci_vdevs數(shù)組中,當(dāng)操作系統(tǒng)對PCI設(shè)備進行枚舉時,能夠發(fā)現(xiàn)到這個直通設(shè)備。

## 虛擬PCI配置空間

設(shè)備直通的一個關(guān)鍵點是讓虛擬機能夠訪問設(shè)備的真實IO空間,它的關(guān)鍵是虛擬機對設(shè)備PCI配置空間的訪問。

### PCI配置空間介紹

CONFIG_ADDRESS

x86平臺上操作系統(tǒng)通過IO端口0xCF8-0xCFF訪問PCI設(shè)備,前32位是CONFIG_ADDRESS,后32位是CONFIG_DATA,CONFIG_ADDRESS中包括BDF和register number,可以索引到PCI設(shè)備上的寄存器。

### 預(yù)定義頭部

- Header Type 決定PCI設(shè)備類型,共有三種類型:普通PCI設(shè)備,PCI橋,CardBus橋,每種PCI設(shè)備的配置空間結(jié)構(gòu)都不相同,上圖展示的是普通PCI設(shè)備的配置空間。

- Base Address Registers,基地址寄存器,它記錄PCI寄存器或者設(shè)備RAM在I/O端口(或者物理地址空間)的地址。

- Capabilities Pointer,capabilities list的頭指針

- Interrupt Pin,Interrupt Line,設(shè)備中斷引腳與中斷線

### 為什么要虛擬PCI配置空間

PCI配置空間包括預(yù)定義頭部(predefined header region)與設(shè)備相關(guān)部分(device dependent region)。預(yù)定義頭部除了包括vendor id,device id,type之外,還包括了六個bar register。PCI設(shè)備有自己的板上存儲空間,這些存儲空間映射的系統(tǒng)軟件的地址空間中,它們具體的地址就存在于bar register中。由于虛擬機不能夠直接訪問物理內(nèi)存,所以它也不能夠直接訪問存儲了物理地址的bar register。

設(shè)備相關(guān)部分包括了PCI MSI中斷信息,MSI通過在PCI配置空間中存儲中斷對象與中斷號,能夠繞過IOAPIC,直接向LAPIC發(fā)起中斷。如果虛擬機可以直接讀寫真實設(shè)備的設(shè)備相關(guān)部分,它將有能力向其他核或者其他虛擬機發(fā)起中斷。這是不可行的。

因此虛擬機監(jiān)控器需要針對直通設(shè)備虛擬出PCI配置空間。

### 如何虛擬PCI配置空間

1. HV 啟動時深度優(yōu)先掃描并記錄所有的PCI總線與設(shè)備

2. 關(guān)閉I/O bitmap讓虛擬機對PCI設(shè)備的端口訪問產(chǎn)生下陷(正如前文介紹,虛擬機通過CONFIG_ADDRSS與CONFIG_DATA兩個端口訪問PCI設(shè)備)。

3. 建立轉(zhuǎn)換表,報告虛擬的PCI BAR給虛擬機,當(dāng)虛擬機通過IO端口訪問PCI設(shè)備(操作系統(tǒng)只能通過端口0xCF8,0xCFC訪問PCI設(shè)備配置空間)時,HV可以截獲操作并通過轉(zhuǎn)換表把I/O請求轉(zhuǎn)發(fā)到設(shè)備的I/O地址空間。

4. 虛擬機不能直接讀寫PCI配置空間,但是可以直接讀寫PCI板上內(nèi)存。由于HV為虛擬機寫入BAR寄存器的GPA建立了第二階段頁表映射,當(dāng)虛擬機訪問BAR寄存器上的GPA指向的地址時,第二階段翻譯能夠?qū)PA翻譯成PCI設(shè)備真正映射的物理地址。于是虛擬機能夠訪問直通設(shè)備的板上內(nèi)存而無需VMM處理。

## 中斷重映射

為了避免虛擬機對外設(shè)發(fā)送惡意中斷,從而對主機或者虛擬機進行攻擊。硬件廠商引入了中斷重映射機制,在外設(shè)與CPU之間加了一個硬件中斷重映射單元。當(dāng)接收到來自外設(shè)的中斷時,硬件重映射單元會對中斷請求的來源進行有效性驗證,然后以中斷號為索引查詢中斷重映射表,代替外設(shè)向目標(biāo)cpu發(fā)送中斷。中斷重映射表由虛擬機進行設(shè)置與安裝。

### VT-d對中斷重映射的支持

下面以Intel VT-d技術(shù)為例介紹硬件對于中斷重映射的支持。

為了支持中斷重映射,需要對中斷源進行升級,包括(I/O APIC,MSI,MSI-X),讓中斷重映射硬件能夠從中斷消息中提出中斷重映射表的索引。因此VT-d設(shè)計了可重映射的中斷消息格式。




中斷重映射硬件能夠通過handle與subhandle計算出中斷在中斷重映射表的索引值。

為了讓中斷重映射硬件知道中斷重映射表的位置,需要在HV初始化的時候分配一塊區(qū)域作為中斷重映射表,并將該區(qū)域?qū)懭胫袛嘀赜成浔淼刂芳拇嫫鳌?br>
中斷重映射表里的中斷重映射條目(IRTE)如下




### MSI中斷發(fā)送流程

先介紹MSI中斷的發(fā)送流程

1. PCIe 設(shè)備在發(fā)送 MSI/MSI-X中斷請求之前,系統(tǒng)軟件需要合理設(shè)置PCIe設(shè)備MSI/MSI-X Capability 寄存器,使 Message Address寄存器的值為0xFEExx00y,同時合理地設(shè)置 Message Data寄存器Vector字段。

2. PCIe設(shè)備提交MSI/MSI-X中斷請求時,需要向0xFEExx00y地址寫Message Data寄存器中包含的數(shù)據(jù),并以存儲器寫TLP的形式發(fā)送到RC。當(dāng)橋片收到這個TLP后,發(fā)現(xiàn)這個TLP的目 的地址在系統(tǒng)總線Interrupts存儲器空間中,則將PCIe總線的存儲器寫請求轉(zhuǎn)換為系統(tǒng)總線Interrupt Message總線事務(wù),并在系統(tǒng)總線上廣播。

3. 系統(tǒng)總線上的CPU,根據(jù)APIC ID信息,選擇是否接收這個Interrupt Message總線事務(wù),并進入中斷狀態(tài),之后該CPU將直接從這個總線事務(wù)中獲得中斷向量號,執(zhí)行相應(yīng)的中斷服 務(wù)例程,而不需要從APIC中斷控制器獲得中斷。




### 設(shè)置中斷重映射表

以MSI中斷為例,為了之后使用MSI中斷,操作系統(tǒng)啟動時需要對PCI配置空間中的MSI capability進行設(shè)置,包括:

1. 讀取設(shè)備的消息控制寄存器的Mulitple Message Capable欄位獲得設(shè)備支持的消息數(shù)量以及是否支持64bit消息地址。然后使能對應(yīng)的enable bit。

2. 分配base message data pattern以及Message Address。

3. 最后使能MSI enable bit并關(guān)閉其它的中斷選項。

當(dāng)虛擬機設(shè)置直通設(shè)備的MSI(X)信息時,將觸發(fā)VM-Exit,此時HV可以設(shè)置中斷重映射表,并向Message Address中寫入可重映射的中斷消息。

當(dāng)在Message Address中寫入可重映射的中斷消息后,設(shè)備發(fā)送MSI中斷時將發(fā)送這個中斷消息到總線上,VT-d硬件能夠讀懂這個消息,并利用可重映射的中斷消息索引出中斷重映射條目,將其發(fā)送給LAPIC。

## DMA重映射

DMA重映射的實現(xiàn)介紹正在整理中。




## 參考資料

Device Passthrough

ARMv8 Virtualization Overview

Insight Into VFIO

minosproject/minos

PCIE_Base_Specification_Revision_4_0_Version 1_0.pdf

vt-directed-io-spec.pdf

Peter:PCIe的中斷機制

https://luohao-brian.gitbooks.io/interrupt-virtualization/content/vt-d-dma-remapping-fen-xi.html

coolboy:pci_root.c - ACPI PCI Root Bridge Driver



關(guān)鍵詞:實現(xiàn),設(shè)備,虛擬

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉