偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何利用虛擬化技術(shù)解決物聯(lián)網(wǎng)開(kāi)發(fā)難題?從了解ACRN開(kāi)始

開(kāi)源 物聯(lián)網(wǎng)應(yīng)用
物聯(lián)網(wǎng)市場(chǎng)的應(yīng)用場(chǎng)景日益復(fù)雜,越來(lái)越多的上網(wǎng)設(shè)備需要支持更多的硬件資源、操作系統(tǒng)、軟件工具及應(yīng)用程序,現(xiàn)有的解決方案顯然無(wú)法為數(shù)量龐大的物聯(lián)網(wǎng)設(shè)備提供相應(yīng)的靈活性,這使開(kāi)發(fā)者們面臨巨大的設(shè)計(jì)壓力。虛擬化技術(shù)是解決這些問(wèn)題的關(guān)鍵。

 物聯(lián)網(wǎng)市場(chǎng)的應(yīng)用場(chǎng)景日益復(fù)雜,越來(lái)越多的上網(wǎng)設(shè)備需要支持更多的硬件資源、操作系統(tǒng)、軟件工具及應(yīng)用程序,現(xiàn)有的解決方案顯然無(wú)法為數(shù)量龐大的物聯(lián)網(wǎng)設(shè)備提供相應(yīng)的靈活性,這使開(kāi)發(fā)者們面臨巨大的設(shè)計(jì)壓力。虛擬化技術(shù)是解決這些問(wèn)題的關(guān)鍵。不過(guò),現(xiàn)有的虛擬化解決方案并不能滿足物聯(lián)網(wǎng)開(kāi)發(fā)的輕量級(jí)和靈活性的特殊要求。為了滿足當(dāng)前物聯(lián)網(wǎng)市場(chǎng)的發(fā)展趨勢(shì),Linux 基金會(huì)推出了開(kāi)源項(xiàng)目 —— ACRN。

ACRN 到底具有哪些強(qiáng)大的功能,它又是怎么實(shí)現(xiàn)的?今天我們就從架構(gòu)到應(yīng)用對(duì) ACRN 進(jìn)行詳細(xì)分析,讓開(kāi)發(fā)者們快速上手使用ACRN進(jìn)行產(chǎn)品設(shè)計(jì)。

ACRN 是一個(gè)專(zhuān)為嵌入式設(shè)備設(shè)計(jì)的 hypervisor,包括如下兩部分:一套 hypervisor 的參考軟件和架構(gòu),通過(guò)虛擬機(jī)監(jiān)視器Virtual Machine Manager可以在同一個(gè)物理硬件上安全地同時(shí)運(yùn)行多個(gè)操作系統(tǒng)。另外,它還為設(shè)備虛擬化模擬定義了一套參考設(shè)計(jì)框架,稱為“ACRN 設(shè)備模型”。

ACRN hypervisor 是一個(gè) Type-I 的 hypervisor,可以直接運(yùn)行在物理硬件上,適用于各種物聯(lián)網(wǎng)和嵌入式設(shè)備解決方案。ACRN hypervisor 解決了當(dāng)前數(shù)據(jù)中心 hypervisor 和 partitioning hypervisor 之間存在的差距。ACRN hypervisor 設(shè)計(jì)時(shí)把系統(tǒng)分為不同的功能域,并為物聯(lián)網(wǎng)和嵌入式設(shè)備精心挑選的用戶操作系統(tǒng)進(jìn)行共享優(yōu)化。 

汽車(chē)應(yīng)用案例

ACRN hypervisor 的一個(gè)有趣的案例是用于汽車(chē)場(chǎng)景。ACRN hypervisor 可以用于構(gòu)建軟件定義駕駛艙(SDC)或者車(chē)載娛樂(lè)系統(tǒng)(IVE)。作為參考實(shí)現(xiàn),ACRN 可以為嵌入式 hypervisor 廠商的解決方案提供一個(gè)很好的基礎(chǔ),以及一套 I/O 設(shè)備虛擬化的參考設(shè)計(jì)。 

在這種場(chǎng)景下,汽車(chē) SDC 系統(tǒng)由儀表盤(pán)(IC)系統(tǒng)、車(chē)載信息娛樂(lè)系統(tǒng)(IVI)和一個(gè)或多個(gè)后座娛樂(lè)系統(tǒng)(RSE)組成。為了整體系統(tǒng)安全性考慮,每個(gè)系統(tǒng)都作為獨(dú)立的虛擬機(jī)運(yùn)行。

儀表盤(pán)系統(tǒng)(IC)用于顯示和駕駛員相關(guān)的車(chē)輛的駕駛操作信息,如:

  • 汽車(chē)的速度、燃油、行駛里程和其它駕駛信息;
  • 投影在擋風(fēng)玻璃上的抬頭顯示,用以警告缺油或胎壓報(bào)警;
  • 顯示后視攝像頭影像和車(chē)身的周邊攝像頭信息,用于輔助停車(chē);

車(chē)載娛樂(lè)系統(tǒng)(IVI)的功能包括:

  • 導(dǎo)航系統(tǒng)、收音機(jī)和其它娛樂(lè)系統(tǒng);
  • 連接到移動(dòng)設(shè)備,可以打電話,播放音樂(lè)或者通過(guò)語(yǔ)音識(shí)別來(lái)控制應(yīng)用程序;
  • 通過(guò)手勢(shì)識(shí)別或觸控進(jìn)行交互;

后座娛樂(lè)系統(tǒng)(RSE)可以運(yùn)行:

  • 娛樂(lè)系統(tǒng);
  • 虛擬辦公;
  • 連接到前排座椅的IVI系統(tǒng)和移動(dòng)設(shè)備(云連接);
  • 連接到移動(dòng)設(shè)備,可以打電話,播放音樂(lè)或者通過(guò)語(yǔ)音識(shí)別來(lái)控制應(yīng)用程序;
  • 通過(guò)手勢(shì)識(shí)別或觸控進(jìn)行交互;

ACRN hypervisor 可以支持 Linux 和 Android 虛擬機(jī)作為用戶操作系統(tǒng)(UOS),UOS 由 ACRN hypervisor 進(jìn)行管理。開(kāi)發(fā)者和 OEM 廠商可以在 ACRN hypervisor 之上運(yùn)行自己的虛擬機(jī),以及 IC、IVI 和 RSE VM。Service OS 是作為 VM0 運(yùn)行(在Xen hypervisor 中被稱為 Dom0,在 KVM hypervisor 中被稱為 Host OS),User OS 用戶操作系統(tǒng)作為 VM1 運(yùn)行(也被稱為 DomU)。

注:Android 虛擬機(jī)的支持將在未來(lái)版本發(fā)布。

圖 1 顯示了一個(gè)使用 ACRN hypervisor 的實(shí)例框圖。

圖 1:SOS 和 UOS 運(yùn)行在 ACRN hypervisor 之上

從 ACRN hypervisor 的架構(gòu)圖中可以看到:

  • ACRN hypervisor 直接位于 bootloader 之上,因而具備快速啟動(dòng)的能力;
  • 部分資源進(jìn)行 partitioning,以確保安全關(guān)鍵性應(yīng)用和非安全關(guān)鍵業(yè)務(wù)可以共存在同一平臺(tái)上;
  • 豐富的 I/O 設(shè)備虛擬化提供在多個(gè) VM 之間的 I/O 設(shè)備共享,從而提供全面的用戶體驗(yàn);
  • 通過(guò)高效的虛擬化,一個(gè) SoC 可以支持多個(gè)操作系統(tǒng)同時(shí)運(yùn)行;

圖 1 中的黃色部分是 ACRN 項(xiàng)目的軟件棧。該架構(gòu)框圖中列出的某些功能還沒(méi)有完全實(shí)現(xiàn),歡迎社區(qū)共同參與開(kāi)發(fā)實(shí)現(xiàn)。另外,圖中的其他模塊來(lái)自于別的開(kāi)源項(xiàng)目,這里僅供參考。

例如,Service OS 和 Guest Linux 來(lái)源于 https://clearlinux.org 上的 Clear Linux 項(xiàng)目,而未來(lái) Guest Android 的支持將會(huì)來(lái)自 https://01.org/android-ia 項(xiàng)目。

當(dāng)前ACRN所支持的功能列表,請(qǐng)參照發(fā)布說(shuō)明。 

許可證

ACRN hypervisor和ACRN Device Model軟件采用的都是自由許可證的BSD-3-Clause,它允許以“源代碼和二進(jìn)制再次發(fā)布和使用,無(wú)論是否進(jìn)行了修改”, 許可證中也注明了完整版權(quán)聲明和免責(zé)聲明。 

ACRN Device Model,Service OS 和 User OS

為了使 ACRN hypervisor 代碼盡可能精悍且高效,用于實(shí)現(xiàn) I/O 設(shè)備共享的 device model 代碼運(yùn)行在 Service OS 中而非 ACRN Hypervisor。哪些 I/O 設(shè)備被共享以及其實(shí)現(xiàn)細(xì)節(jié)將在下面的 pass-through 章節(jié)具體介紹。

Service OS 在所有虛擬機(jī)里,以最高優(yōu)先權(quán)運(yùn)行,以滿足那些對(duì)時(shí)間響應(yīng)要求很高的需求和系統(tǒng)服務(wù)質(zhì)量的需求(QoS)。具體到 Service OS 中的任務(wù)task,他們的優(yōu)先級(jí)則有高有低。例如響應(yīng) User OS 請(qǐng)求的回調(diào)函數(shù),其運(yùn)行在 Service OS 的軟件(或者 mediator)就會(huì)繼承 User OS 的優(yōu)先級(jí)。另外,在 Service OS 中還有一些在后臺(tái)運(yùn)行的任務(wù)也是低優(yōu)先級(jí)。

在上述的車(chē)載系統(tǒng)示例中,User OS 是駕駛控制和車(chē)內(nèi)娛樂(lè)的中心樞紐。它能提供收音機(jī)和各種娛樂(lè)選項(xiàng)、車(chē)內(nèi)空調(diào)和通風(fēng)控制、車(chē)輛導(dǎo)航顯示等支持。它可以讓第三方設(shè)備使用 USB、藍(lán)牙或者 WiFi 等連接技術(shù)與車(chē)載系統(tǒng)進(jìn)行交互,例如:Android Auto 或者 Apple CarPlay, 還能提供許多其它功能。 

啟動(dòng)步驟

在圖 2 中,我們展示了在一個(gè)采用英特爾架構(gòu)平臺(tái)的NUC上使用UEFI驗(yàn)證啟動(dòng)的步驟。

 

圖 2: ACRN Hypervisor 啟動(dòng)步驟

啟動(dòng)引導(dǎo)順序執(zhí)行如下:

  1. UEFI 驗(yàn)證和啟動(dòng) ACRN hypervisor 和 Service OS 的引導(dǎo)加載程序;
  2. UFEI(或 Service OS 的引導(dǎo)加載程序)驗(yàn)證并啟動(dòng) Service OS 內(nèi)核;
  3. Service OS 的內(nèi)核通過(guò) dm-verity 驗(yàn)證并且加載 ACRN Device Model 和虛擬引導(dǎo)加載程序;
  4. 虛擬引導(dǎo)加載程序啟動(dòng)用戶端的驗(yàn)證啟動(dòng)進(jìn)程;

ACRN Hypervisor 架構(gòu)

ACRN hypervisor 是 Type 1 的虛擬機(jī)管理程序,能夠直接運(yùn)行在硬件系統(tǒng)上。它是一個(gè)混合的 VMM 架構(gòu),采用一個(gè)運(yùn)行在特權(quán)級(jí)的 Service OS 來(lái)管理和協(xié)調(diào) I/O 設(shè)備的使用。它能支持多個(gè)用戶虛擬機(jī),其中每個(gè)虛擬機(jī)都可以運(yùn)行 Linux 或者安卓操作系統(tǒng)作為用戶操作系統(tǒng)。

在虛擬機(jī)內(nèi)運(yùn)行的操作系統(tǒng)是與其它虛擬機(jī)內(nèi)的系統(tǒng)或應(yīng)用程序相互隔離的,從而縮小了潛在的被攻擊可能性,最大限度地減小安全隱患。當(dāng)然由于系統(tǒng)運(yùn)行在虛擬機(jī)內(nèi)也可能會(huì)給其應(yīng)用程序的運(yùn)行帶來(lái)額外的延遲。 

圖3顯示了 ACRN hypervisor、車(chē)載系統(tǒng)中的 Instrumental Cluster (IC) VM 和 Service VM 一起協(xié)同工作的架構(gòu)圖。Service OS(SOS)負(fù)責(zé)包括平臺(tái)設(shè)備在內(nèi)的大部分設(shè)備的管理,并提供 I/O 的協(xié)調(diào)功能。某些PCIe設(shè)備可以通過(guò)VM配置直通給 User OS 使用。IC 應(yīng)用程序和虛擬機(jī)特定的應(yīng)用程序都運(yùn)行在 SOS 中,例如:ACRN device model 和 ACRN VM 管理器。

ACRN hypervisor 內(nèi)還有 ACRN 虛機(jī)管理器,用來(lái)收集 User OS 的運(yùn)行信息,并控制用戶虛擬機(jī)的開(kāi)始、停止和暫停,還能暫?;蛘呋謴?fù)執(zhí)行單個(gè)虛擬 CPU。

圖 3: ACRN Hypervisor 架構(gòu)圖 

ACRN hypervisor 采用了英特爾虛擬化技術(shù)(Intel VT),其運(yùn)行在虛擬機(jī)擴(kuò)展模式(VMX)的 root 模式下,也稱為主機(jī)模式或 VMM 模式。其他所有的用戶虛擬機(jī)包括 UOS 和 SOS 都運(yùn)行在 VMX non-root 模式或 guest 模式下。(以下為了簡(jiǎn)略,我們將繼續(xù)使用術(shù)語(yǔ) VMM 模式和 guest 模式)。

VMM 模式下有 4 種權(quán)限的 ring 模式,但 ACRN hypervisor 僅在 ring 0 的特權(quán)模式下運(yùn)行,其余 ring 1-3 并未使用。運(yùn)行在 guest 模式下的用戶系統(tǒng)(包括 SOS 和 UOS)也有自己的 4 個(gè) ring 模式(ring 0-3)。用戶系統(tǒng)的內(nèi)核運(yùn)行在 guest 模式下的 ring 0,而用戶系統(tǒng)的應(yīng)用程序則在 guest 模式下運(yùn)行于 ring 3(ring 1 和 ring 2 一般不被商業(yè)操作系統(tǒng)所使用)。

圖 4: VMX 簡(jiǎn)介 

圖 4: VMX 簡(jiǎn)介

如圖 4 所示,VMM 模式和 guest 模式通過(guò) VM Exit 和 VM Entry 進(jìn)行切換。當(dāng)引導(dǎo)加載程序?qū)⒖刂茩?quán)交給 ACRN hypervisor 時(shí),處理器還未啟動(dòng) VMX 模式。ACRN hypervisor 首先需要通過(guò) VMXON 指令啟用 VMX 模式。啟用 VMX 后,處理器處于 VMM 模式,它可以通過(guò) VM resume 指令進(jìn)入 guest 模式(或者通過(guò)第一次 VM launch 指令),然后可以通過(guò)處理器的 VM exit 事件回到 VMM 模式。一般處理器會(huì)在響應(yīng)某些指令和事件時(shí)發(fā)生 VM exit。

在 guest 模式下,處理器的執(zhí)行是由一個(gè)虛擬機(jī)控制結(jié)構(gòu)(VMCS)所控制的。VMCS 包含了虛機(jī)狀態(tài)(在 VM Entry 時(shí)加載并在 VM Exit 時(shí)保存),主機(jī)狀態(tài)(在 VM exit 時(shí)加載),以及虛機(jī)的控制執(zhí)行。ACRN hypervisor 為每個(gè)虛擬 CPU 創(chuàng)建了一個(gè) VMCS 數(shù)據(jù)結(jié)構(gòu),并使用該 VMCS 來(lái)控制運(yùn)行在 guest 模式下處理器的行為。 

當(dāng)虛機(jī)執(zhí)行到一個(gè)敏感指令時(shí),就會(huì)觸發(fā)一次定義在 VMCS 配置中的 VM exit 事件。當(dāng) VM exit 發(fā)生后,系統(tǒng)的控制權(quán)就交給了 ACRN hypervisor。ACRN hypervisor 會(huì)模擬虛機(jī)的指令(如果 VM exit 的原因是由于指令權(quán)限問(wèn)題),然后恢復(fù)虛機(jī)繼續(xù)執(zhí)行它的下一條指令,或者根據(jù) VM exit 的原因進(jìn)行相關(guān)處理(例如,一個(gè)虛機(jī)的存儲(chǔ)頁(yè)面需要建立映射關(guān)系),然后恢復(fù)虛機(jī)重新執(zhí)行該條指令。

需要注意的是用于VMM模式的地址空間和用于 guest 模式的地址空間是不同的。guest 模式和 VMM 模式下使用不同的內(nèi)存映射表,因此虛機(jī)是無(wú)法訪問(wèn) ACRN hypervisor 的。ACRN hypervisor 使用 EPT 來(lái)映射虛機(jī)地址,虛機(jī)頁(yè)表會(huì)將虛機(jī)的線性地址映射到虛機(jī)的物理地址, EPT 表則將虛機(jī)的物理地址映射到機(jī)器物理地址或主機(jī)物理地址(HPA)。  

ACRN 設(shè)備模式架構(gòu)

因?yàn)橄到y(tǒng)設(shè)備可能需要在不同的虛機(jī)之間被共享,虛機(jī)內(nèi)應(yīng)用程序(和操作系統(tǒng))要對(duì)這些共享設(shè)備進(jìn)行訪問(wèn)就需要借助設(shè)備模擬。一般來(lái)說(shuō),設(shè)備模擬有三種架構(gòu): 

  • 第一種架構(gòu)被稱為 hypervisor中 的設(shè)備模擬,這是在 VMware 工作站產(chǎn)品(一個(gè)基于操作系統(tǒng)的 hypervisor)中實(shí)現(xiàn)的設(shè)備模擬方式。在這種方式中,hypervisor 負(fù)責(zé)模擬需要在各個(gè)虛機(jī)操作系統(tǒng)之間共享的常見(jiàn)設(shè)備,其中包括:虛擬磁盤(pán)、虛擬網(wǎng)絡(luò)適配器和其它必要的平臺(tái)資源。
  • 第二種架構(gòu)稱為用戶空間的設(shè)備模擬。顧名思義,不是將設(shè)備模擬的實(shí)現(xiàn)嵌入到 hypervisor 中,而是將其放在一個(gè)用戶空間的應(yīng)用程序中實(shí)現(xiàn)。比如被各種獨(dú)立的 hypervisor 所使用的 QEMU 就提供了此類(lèi)的設(shè)備模擬方式。這種架構(gòu)的優(yōu)勢(shì)在于設(shè)備模擬的實(shí)現(xiàn)不依賴于 hypervisor,所以其它 hypervisor 可以重用改實(shí)現(xiàn)。甚至它還可以做任意設(shè)備的模擬,而不必?fù)?dān)心其功能的實(shí)現(xiàn)會(huì)影響 hypervisor(其在特權(quán)模式下運(yùn)行)。
  • 第三種架構(gòu)則是從基于 hypervisor 的設(shè)備模擬改變而來(lái)的半虛擬化驅(qū)動(dòng)程序。該架構(gòu)一開(kāi)始是在XEN項(xiàng)目中引入的,其中 hypervisor 提供物理設(shè)備驅(qū)動(dòng),每個(gè)虛機(jī)操作系統(tǒng)則需要安裝一個(gè)與能與物理驅(qū)動(dòng)配合使用的 hypervisor 感知的驅(qū)動(dòng)程序。

在以上討論的設(shè)備模擬架構(gòu)中,共享設(shè)備都需要付出代價(jià)。因?yàn)椴还茉O(shè)備模擬是在 hypervisor 中,還是在每個(gè)虛機(jī)內(nèi)的用戶空間中,都存在相應(yīng)的系統(tǒng)開(kāi)銷(xiāo)。不過(guò)只要系統(tǒng)設(shè)備需要被多個(gè)虛機(jī)操作系統(tǒng)共享,這種開(kāi)銷(xiāo)就是值得的。反之如果設(shè)備不需要被共享,那么就可以使用更有效的方法來(lái)訪問(wèn)設(shè)備,例如使用“直通”。

看完以上的分析,你是否對(duì) ACRN 有了更深入的了解?也是否有更多問(wèn)題急需解答? 不用著急,我們將在下期中繼續(xù)講解各種技術(shù)細(xì)節(jié),例如 ACRN 設(shè)備模塊架構(gòu)、設(shè)備 pass through, ACRN I/O mediator,Virtio 框架結(jié)構(gòu)等一一為你展示。

ACRN 的設(shè)備模塊

在 ACRN 中,每個(gè) User OS(簡(jiǎn)稱 UOS)都需要有一個(gè) ACRN 設(shè)備模型與之對(duì)應(yīng)。ACRN 設(shè)備模型首先為 UOS 初始化虛擬硬件平臺(tái)(包括初始化 VCPU 狀態(tài)、分配并初始化內(nèi)存、初始化 UOS 啟動(dòng)腳本中所指定的虛擬設(shè)備)、加載 guest 平臺(tái)固件文件或 guest 操作系統(tǒng)內(nèi)核文件等,并最終通過(guò)調(diào)用 ACRN hypervisor 提供的服務(wù)去執(zhí)行g(shù)uest指令。

ACRN 設(shè)備模型是運(yùn)行在 Service OS(簡(jiǎn)稱 SOS)上的應(yīng)用程序,其架構(gòu)如圖5所示。

圖 5: ACRN 設(shè)備模塊

在 ACRN 中, I/O 虛擬化主要依賴于以下三部分的協(xié)同工作:

  1. 設(shè)備仿真
  2. I/O 請(qǐng)求處理
  3. VHM(Virtio 和 Hypervisor 服務(wù)模塊) 

設(shè)備仿真

設(shè)備仿真指的是一系列 I/O 設(shè)備仿真例程,用來(lái)模擬不同種類(lèi)的設(shè)備,比如 PCI 總線設(shè)備、ACPI 設(shè)備等。這些設(shè)備仿真例程均會(huì)被注冊(cè)到 ACRN 設(shè)備模型中,由 ACRN 設(shè)備模型中的 I/O 調(diào)度器進(jìn)行調(diào)度和分發(fā)。當(dāng) UOS 產(chǎn)生 I/O 設(shè)備訪問(wèn)請(qǐng)求時(shí),I/O  調(diào)度器會(huì)根據(jù)請(qǐng)求的 I/O 地址,PIO 或者 MMIO,進(jìn)一步調(diào)用具體設(shè)備的仿真例程。 

I/O 請(qǐng)求(簡(jiǎn)稱 IOREQ)處理

參照以下 ACRN-I/O-mediator 。 

VHM

VHM(Virtio 和 Hypervisor 服務(wù)模塊)作為 ACRN hypervisor 和設(shè)備模型之間的橋梁,為設(shè)備模型提供必要的服務(wù)。VHM 運(yùn)行在 Service OS 中,以內(nèi)核模塊的形式存在,其具體的服務(wù)流程,如下所述: 

  1. ACRN hypervisor 通過(guò)中斷的方式通知 VHM 新的 IOREQ 到來(lái);
  2. VHM 首先將 IOREQ 標(biāo)記為“正在處理”,同時(shí)將其發(fā)送給 VHM 的用戶(如設(shè)備模型、gvt-g、VBS-K 等)做進(jìn)一步處理。之后,VHM 可以處理新的 IOREQ;
  3. 實(shí)際對(duì) IOREQ 進(jìn)行處理的可以是運(yùn)行在 SOS 用戶態(tài)的ACRN設(shè)備模型,也可以是運(yùn)行在 SOS 內(nèi)核態(tài)中的其他設(shè)備模型,如 gvt-g 和 VBS-K。一旦 IOREQ 被處理完成,VHM 將被通知(內(nèi)核態(tài)直接通過(guò)函數(shù)調(diào)用方式通知,而用戶態(tài)則通過(guò) IOCTL 的方式通知),之后 VHM 通過(guò) hypercall 的方式,進(jìn)一步通知 ACRN hypervisor 該 IOREQ 已經(jīng)處理完成。

用戶態(tài)程序:ACRN 設(shè)備模型;

內(nèi)核態(tài)模塊:VHM、VBS-K、gvt-g 等; 

設(shè)備直通

總體上講,設(shè)備直通是為了將指定設(shè)備排他性提供給某個(gè)客戶操作系統(tǒng)獨(dú)立使用。

圖 6: 設(shè)備直通

圖 6: 設(shè)備直通

通過(guò)設(shè)備直通可以實(shí)現(xiàn)幾乎原生的性能。在不需要在多個(gè)虛擬機(jī)中共享同一個(gè)設(shè)備的情況下,如系統(tǒng)中有多塊物理設(shè)備,設(shè)備直通對(duì)于某些高 I/O 需求的設(shè)備來(lái)說(shuō)是最佳選擇,因?yàn)橥ㄟ^(guò) hypervisor(無(wú)論是在 hypervisor 中還是在用戶空間中)虛擬設(shè)備會(huì)產(chǎn)生額外的性能下降。

除了性能角度考量外,有些設(shè)備先天不能被用在多個(gè)虛擬共享環(huán)境中,如 USB device 模式的 xDCI 端口。對(duì)于這類(lèi)設(shè)備,ACRN 中則直接采用設(shè)備直通的方式供客戶操作系統(tǒng)使用。 

設(shè)備直通的硬件支持

英特爾目前的處理器架構(gòu)使用 VT-d 為設(shè)備直通提供支持。VT-d 將客戶平臺(tái)物理地址映射到本地平臺(tái)機(jī)器物理地址,從而客戶操作系統(tǒng)能夠通過(guò)訪問(wèn)客戶平臺(tái)物理地址進(jìn)而訪問(wèn)到本地平臺(tái)的物理硬件。在這個(gè)過(guò)程中,VT-d 負(fù)責(zé)設(shè)備的發(fā)訪問(wèn)和保護(hù),而客戶平臺(tái)操作系統(tǒng)只需像非虛擬化環(huán)境中一樣,直接訪問(wèn)設(shè)備。除此之外,VT-d 還能防止物理設(shè)備惡意訪問(wèn)屬于其他 VM 或者 hypervisor 的內(nèi)存,從而能夠提高安全性。

此外,在 ACRN 項(xiàng)目中,設(shè)備主要使用 MSIx/MSI 中斷,而不是傳統(tǒng)的基于中斷 pin 的方式通知 guest。從而帶來(lái)的好處在于不僅能夠很好地處理來(lái)自于多個(gè) VM 多個(gè)中斷的情況,而且能夠保證中斷源的隔離。 

設(shè)備直通的 hypervisor 支持

較新的英特爾處理器架構(gòu)均支持 VT-d,因此各主流 hypervisor(Xen 和 KVM)均可以基于 VT-d 實(shí)現(xiàn)設(shè)備直通的功能。ACRN 同樣基于 VT-d 實(shí)現(xiàn)設(shè)備直通的功能。 

ACRN 虛擬 I/O 設(shè)備

圖 7 展示了ACRN 中訪問(wèn)一個(gè)虛擬 I/O 所經(jīng)歷的流程。

圖 7 I/O 虛擬流程(Port IO) 

以下是圖 7 中的編號(hào)項(xiàng)目:

  1. 當(dāng) guest 操作系統(tǒng)執(zhí)行 I/O 指令(PIO 或 MMIO)時(shí),VM-Exit 發(fā)生,ACRN hypervisor 獲得處理器控制權(quán),首先會(huì)判斷虛擬機(jī)執(zhí)行退出的原因。在我們的例子中,VM-Exit 是因?yàn)?guest 中發(fā)生了 PIO 訪問(wèn),退出原因的號(hào)碼為VMX_EXIT_REASON_IO_INSTRUCTION。
  2. 除了根據(jù) VM-Exit 的原因號(hào)碼,ACRN hypervisor 還會(huì)對(duì)產(chǎn)生 VM-Exit 的指令進(jìn)行譯碼。在我們的例子中,hypervisor會(huì)注意到是 PIO 指令(例如:in AL, 20h)。接下來(lái),hypervisor 將譯碼得到的相關(guān)信息(包括 PIO 訪問(wèn)、訪問(wèn)字節(jié)數(shù)、讀/寫(xiě)方式、目標(biāo)寄存器等)放到與 ACRN VHM、ACRN 設(shè)備模型共享的物理頁(yè)面之中,然后以中斷的方式通知 SOS/VHM 去做進(jìn)一步處理。
  3. SOS 中的 VHM 接收到中斷后,查詢?cè)?IOREQ 有關(guān)的所有信息。
  4. VHM 首先會(huì)檢查是否應(yīng)該由內(nèi)核態(tài)的設(shè)備模型來(lái)處理該 IOREQ,如果是,那么相應(yīng)的內(nèi)核模塊之前注冊(cè)的callback函數(shù)會(huì)被 VHM 調(diào)用。否則,如果沒(méi)有內(nèi)核態(tài)設(shè)備模型來(lái)處理 IOREQ,那么 VHM 則會(huì)將該 IOREQ 保留在共享頁(yè)面中,并喚醒 ACRN 設(shè)備模型對(duì)該 IOREQ 進(jìn)行處理。
  5. ACRN 設(shè)備模型采用與 VHM 相同的機(jī)制對(duì) IOREQ 進(jìn)行處理。設(shè)備模型的 I/O 執(zhí)行線程會(huì)首先查詢 IOREQ 具體的信息,同時(shí)檢查是否有設(shè)備仿真模塊實(shí)現(xiàn)了該 IOREQ 對(duì)應(yīng)的邏輯。如果有相應(yīng)的模塊,那么該模塊對(duì)應(yīng)的 callback 函數(shù)將會(huì)被調(diào)用。
  6. ACRN 設(shè)備模型完成設(shè)備模擬仿真后(本示例中是對(duì)端口 IO 20h 的訪問(wèn)),uDev1 將結(jié)果保存到共享頁(yè)面(示例中保存在 AL 寄存器)。
  7. 完成相應(yīng) IOREQ 的模擬和仿真后,ACRN 設(shè)備模型通過(guò) VHM 的 API 將控制權(quán)返回給 ACRN hypervisor。
  8. ACRN hypervisor 得知 IOREQ 已經(jīng)處理完成,則會(huì)結(jié)果保存到 VCPU 的相應(yīng)寄存器中。
  9. ACRN hypervisor 更新完 VCPU 寄存器后,進(jìn)一步更新IP地址寄存器指向下一條 guest 指令,同時(shí)重啟 guest 的執(zhí)行。

針對(duì) guest 中 MMIO 訪問(wèn)的處理,與上面例子中的 PIO 訪問(wèn)處理類(lèi)似,除了 VM-Exit 的原因不同:MMIO 對(duì)應(yīng)的 VM-Exit 原因代碼是 VMX_EXIT_REASON_EPT_VIOLATION。

Virtio 框架架構(gòu)

Virtio 是一種通用的面向虛擬設(shè)備的抽象,可以應(yīng)用在任何 hypervisor 中。在 ACRN 參考設(shè)計(jì)中,我們的 Virtio 實(shí)現(xiàn)兼容 Virtio 標(biāo)準(zhǔn)規(guī)范 0.9 和 1.0。帶來(lái)的好處是,對(duì)于虛擬設(shè)備的實(shí)現(xiàn),虛擬環(huán)境和客戶平臺(tái)可以復(fù)用一套直觀、高效、標(biāo)準(zhǔn)和可擴(kuò)展的機(jī)制,而無(wú)需根據(jù)每個(gè)環(huán)境或者操作系統(tǒng)進(jìn)行定制。

Virtio 提供一個(gè)通用的前端/后端驅(qū)動(dòng)程序框架,它不僅標(biāo)準(zhǔn)化 virtio 設(shè)備的訪問(wèn)接口,而且還增加了不同的虛擬化平臺(tái)上的代碼重用。

圖 8: Virtio 架構(gòu) 

為了更好地理解 Virtio,尤其是它在 ACRN 項(xiàng)目中的使用,下面列舉幾個(gè) Virtio 的關(guān)鍵概念:

Virtio 前端驅(qū)動(dòng)程序

Virtio 采用了前端-后端架構(gòu),分別為前端和后端 Virtio 驅(qū)動(dòng)程序提供一個(gè)簡(jiǎn)單又靈活的框架。Virtio 前端驅(qū)動(dòng)框架提供了前端Virtio API 來(lái)配置硬件、傳遞消息、提交請(qǐng)求、通知后端 Virtio 驅(qū)動(dòng)程序等。因此,Virtio 前端驅(qū)動(dòng)程序很容易實(shí)現(xiàn),并且性能與設(shè)備模擬仿真相比有較大提升。

后端 Virtio 驅(qū)動(dòng)程序

與 Virtio 前端驅(qū)動(dòng)程序類(lèi)似,Virtio 后端驅(qū)動(dòng)程序運(yùn)行在宿主平臺(tái)(內(nèi)核態(tài)或者用戶態(tài))。Virtio 后端驅(qū)動(dòng)程序處理來(lái)自于前端驅(qū)動(dòng)程序的請(qǐng)求,并按需將請(qǐng)求進(jìn)一步發(fā)送到本地設(shè)備驅(qū)動(dòng)程序。一旦請(qǐng)求被 Virtio 后端驅(qū)動(dòng)程序處理完成,后端驅(qū)動(dòng)程序就會(huì)通知前端驅(qū)動(dòng)程序“請(qǐng)求已完成”。

直觀:Virtio 設(shè)備復(fù)用已有設(shè)備總線

Virtio 復(fù)用已有設(shè)備總線,而不是創(chuàng)建全新類(lèi)型的設(shè)備總線,帶來(lái)的好處是 Virtio 前端和后端驅(qū)動(dòng)可以直接利用已有的代碼進(jìn)行交互。例如,Virtio 前端驅(qū)動(dòng)程序可以直接讀/寫(xiě)虛擬設(shè)備(由 Virtio 后端驅(qū)動(dòng)程序虛擬)的寄存器,同時(shí)虛擬設(shè)備(由 Virtio 后端驅(qū)動(dòng)程序虛擬)可以直接以中斷的方式通知前端驅(qū)動(dòng)程序事件的發(fā)生。目前,Virtio 標(biāo)準(zhǔn)規(guī)范定義了幾種總線結(jié)果,如PCI/PCIe 總線、MMIO 總線、CCW 總線等。目前 ACRN 項(xiàng)目只支持 PCI/PCIe 總線。

高效:鼓勵(lì)批處理操作

批處理操作和延遲通知對(duì)于實(shí)現(xiàn)高性能 I/O 非常重要,因?yàn)閂irtio前端和后端驅(qū)動(dòng)程序之間的通知會(huì)導(dǎo)致代價(jià)高昂的VM-Exit等。因此應(yīng)當(dāng)盡可能批量處理數(shù)據(jù),同時(shí)減少事件的通知。 

標(biāo)準(zhǔn):virtqueue

所有 Virtio 設(shè)備使用同一套稱為 virtqueue 的機(jī)制,其內(nèi)部實(shí)現(xiàn)是兩個(gè)標(biāo)準(zhǔn)環(huán)形緩沖區(qū)和一個(gè)描述符列表,如圖 6 所示。Virtqueue 是一個(gè)分散-聚集緩沖區(qū)隊(duì)列,主要有以下三種操作方式:

  • add_buf 在 virtqueue 中添加請(qǐng)求/響應(yīng);
  • get_buf 在 virtqueue 中獲得響應(yīng)/請(qǐng)求;
  • kick 通知對(duì)方 virtqueue 已經(jīng)被更新;

virtqueue 由 Virtio 前端驅(qū)動(dòng)程序在 guest 物理內(nèi)存中創(chuàng)建。Virtio 后端驅(qū)動(dòng)程序只需要調(diào)用 Virtio API 解析 virtqueue 的結(jié)構(gòu)即可獲得請(qǐng)求或響應(yīng)。如何構(gòu)建 virtqueue 則取決于 guest 操作系統(tǒng)。在 Linux 中實(shí)現(xiàn) Virtio 時(shí),virtqueue 被實(shí)現(xiàn)為一個(gè)稱為 vring 的環(huán)形緩沖結(jié)構(gòu)。

在 ACRN 的 Virtio 前端驅(qū)動(dòng)程序開(kāi)發(fā)過(guò)程中,virtqueue API 可被直接利用,從而用戶無(wú)需關(guān)心 virtqueue 的具體內(nèi)部細(xì)節(jié)。關(guān)于 virtqueue 實(shí)現(xiàn)的更多細(xì)節(jié),請(qǐng)參考您所使用的 guest 操作系統(tǒng)。

可擴(kuò)展:特征 bit

每個(gè) Virtio 設(shè)備和其 Virtio 前端驅(qū)動(dòng)程序之間都存在一個(gè)簡(jiǎn)單可擴(kuò)展的特征協(xié)商feature negotiation機(jī)制。每個(gè)Virtio設(shè)備都可以聲明其設(shè)備特定的功能,而相應(yīng)地 Virtio 前端驅(qū)動(dòng)程序可以表示自己能夠理解哪些硬件特征。這種特征協(xié)商的機(jī)制能夠保證驅(qū)動(dòng)程序向前和向后兼容。 

在 ACRN 參考實(shí)現(xiàn)中,Virtio 前端驅(qū)動(dòng)程序存在于 guest 操作系統(tǒng)的內(nèi)核態(tài)空間,而 Virtio 后端驅(qū)動(dòng)程序則存在兩種可能:用戶態(tài)和內(nèi)核態(tài)。圖 9 顯示了 ACRN 中用戶態(tài)的 Virtio 后端驅(qū)動(dòng)程序架構(gòu)。

圖 9: Virtio 框架 – 用戶態(tài)程序

在 ACRN virtio 后端驅(qū)動(dòng)框架中,該實(shí)現(xiàn)兼容 virtio 標(biāo)準(zhǔn)規(guī)范 0.9 和 1.0 版本。VBS-U 與設(shè)備模型靜態(tài)鏈接,并通過(guò) PCIe/PCI 虛擬設(shè)備接口(PIO/MMIO 或 MSI/MSIx)與設(shè)備模型通信。VBS-U 通過(guò)用戶態(tài) virtqueue API 來(lái)訪問(wèn) Virtio 前端驅(qū)動(dòng)程序在共享內(nèi)存中放置的數(shù)據(jù)。SOS 訪問(wèn) UOS 物理內(nèi)存則是基于 ACRN hypervisor 的幫助。

圖 10: Virtio 框架- 內(nèi)核態(tài)程序

從性能角度出發(fā),為了支持一些性能要求較高的設(shè)備,數(shù)據(jù)平面data plane的處理可以從用戶態(tài)挪到內(nèi)核態(tài),從而避免 Virtio 后端驅(qū)動(dòng)在用戶態(tài)和內(nèi)核態(tài)切換時(shí)產(chǎn)生額外的數(shù)據(jù)搬運(yùn);而控制平面control plane的處理,仍然保留在用戶空間,即 VBS-U 中。VBS-U需要選擇在正確的時(shí)間初始化 VBS-K,例如,Virtio 前端驅(qū)動(dòng)設(shè)置 VIRTIO_CONFIG_S_DRIVER_OK 時(shí)就是一個(gè)不錯(cuò)的時(shí)機(jī)。運(yùn)行在內(nèi)核態(tài)的 Virtio 后端驅(qū)動(dòng)可以使用 VBS-K virtqueue API 前端驅(qū)動(dòng)共享的數(shù)據(jù)??紤]到易用性,VBS-K virtqueue API 與 VBS-U virqueue API 設(shè)計(jì)得極為相似。此外,VBS-K 依賴于 VHM,即 VHM 負(fù)責(zé)分發(fā) IOREQ 給 VBS-K 模塊。每個(gè) VBS-K 需要處理一類(lèi)或者多類(lèi) IOREQ 請(qǐng)求,具體多少取決于特定的VBS-K需要監(jiān)聽(tīng)多少段連續(xù)的寄存器空間。最后,VBS-K 借助于 VHM 的 API 來(lái)通過(guò)中斷的方式通知 Virtio 前端驅(qū)動(dòng)程序。

看到這里,開(kāi)發(fā)者們是不是有興趣親自動(dòng)手實(shí)踐了,如果您在項(xiàng)目設(shè)計(jì)中遇到關(guān)于ACRN的技術(shù)問(wèn)題,歡迎訪問(wèn)ACRN社區(qū)進(jìn)行討論,社區(qū)地

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2015-07-01 09:47:38

2020-06-20 14:00:36

物聯(lián)網(wǎng)智能停車(chē)技術(shù)

2020-06-12 17:33:20

物聯(lián)網(wǎng)藍(lán)牙技術(shù)

2021-11-29 10:38:05

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)技術(shù)

2022-08-08 13:44:45

物聯(lián)網(wǎng)醫(yī)療保健

2010-04-29 15:03:53

存儲(chǔ)虛擬化數(shù)據(jù)中心

2019-02-28 06:14:18

物聯(lián)網(wǎng)物聯(lián)網(wǎng)開(kāi)發(fā)IOT

2021-11-02 14:03:35

物聯(lián)網(wǎng)技術(shù)水損害物聯(lián)網(wǎng)

2016-01-06 14:29:59

物聯(lián)網(wǎng)物聯(lián)網(wǎng)技術(shù)智能生活

2022-03-09 14:20:34

工業(yè)物聯(lián)網(wǎng)物聯(lián)網(wǎng)

2021-05-17 20:39:47

物聯(lián)網(wǎng)互聯(lián)網(wǎng)IoT

2015-11-03 09:24:33

物聯(lián)網(wǎng)各大產(chǎn)業(yè)

2020-06-20 13:57:29

物聯(lián)網(wǎng)工業(yè)物聯(lián)網(wǎng)技術(shù)

2018-06-28 23:03:10

物聯(lián)網(wǎng)云梯電梯

2022-01-20 15:23:23

區(qū)塊鏈技術(shù)數(shù)字資產(chǎn)

2018-03-21 08:52:09

Linux程序物聯(lián)網(wǎng)

2020-09-03 16:50:17

物聯(lián)網(wǎng)技術(shù)冠狀病毒物聯(lián)網(wǎng)

2023-07-27 10:17:31

LoRa 技術(shù)物聯(lián)網(wǎng)

2020-10-16 16:11:01

物聯(lián)網(wǎng)智能家居技術(shù)

2018-10-10 05:12:35

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)