電腦系統模擬器:熟悉的全平台模擬器和未知的順時針和痕跡

在關於電腦系統模擬器的文章的第二部分中,我將繼續以簡單的介紹形式談論電腦模擬器,即普通用戶最常遇到的全平台模擬,以及時脈-時鐘模型和跡線,這在開發者圈子裡比較常見。

電腦系統模擬器:熟悉的全平台模擬器和未知的順時針和痕跡

В 第一部分 我討論了模擬器的一般意義以及模擬的等級。 現在,基於這些知識,我建議更深入地討論全平台模擬、如何收集追蹤、稍後如何處理它們,以及逐個時脈微架構模擬。

全平台模擬器,還是“孤軍奮戰不是勇士”

如果你想研究一個特定設備(例如網卡)的操作,或者為這個設備編寫韌體或驅動程序,那麼可以單獨模擬這樣一個設備。 然而,與基礎設施的其餘部分隔離地使用它並不是很方便。 要運行相應的驅動程序,您將需要中央處理器、記憶體、資料匯流排的存取權限等。 此外,驅動程式需要作業系統 (OS) 和網路堆疊才能運作。 此外,可能需要單獨的資料包產生器和回應伺服器。

全平台模擬器創建一個運行完整軟體堆疊的環境,其中包括從 BIOS 和引導程式到作業系統本身及其各種子系統的所有內容,例如相同的網路堆疊、驅動程式和用戶級應用程式。 為此,它實現了大多數電腦設備的軟體模型:處理器和記憶體、磁碟、輸入/輸出設備(鍵盤、滑鼠、顯示器)以及相同的網路卡。

下面是 Intel x58 晶片組的框圖。 此晶片組上的全平台電腦模擬器需要實現大多數列出的設備,包括 IOH(輸入/輸出集線器)和 ICH(輸入/輸出控制器集線器)內的設備,這些設備在框圖中沒有詳細描述。 儘管實踐表明,我們要運行的軟體不使用的設備並不多。 不需要建立此類設備的模型。

電腦系統模擬器:熟悉的全平台模擬器和未知的順時針和痕跡

大多數情況下,全平台模擬器是在處理器指令層級(ISA,見下文)實現的。 上一篇文章)。 這使您可以相對快速且廉價地創建模擬器本身。 ISA 等級也很好,因為它或多或少保持恆定,這與 API/ABI 等級不同,後者更頻繁地變化。 此外,指令級的實作允許您運行所謂的未修改的二進位軟體,即運行已編譯的程式碼而不進行任何更改,就像在真實硬體上使用一樣。 換句話說,您可以製作硬碟的副本(「轉儲」),將其指定為全平台模擬器中模型的映像,然後瞧! – 作業系統和其他程式載入到模擬器中,無需任何其他操作。

模擬器性能

電腦系統模擬器:熟悉的全平台模擬器和未知的順時針和痕跡

如同上面所提到的,模擬整個系統(即所有設備)的過程是一項相當緩慢的工作。 如果您還在非常詳細的層級(例如微架構或邏輯層級)實現所有這些,那麼執行將變得非常慢。 但指令層級是一個合適的選擇,它允許作業系統和程式以足以讓使用者舒適地與之互動的速度執行。

在這裡討論模擬器性能的話題是合適的。 通常以 IPS(每秒指令數)來衡量,更準確地說以 MIPS(百萬 IPS)為單位,即模擬器在一秒鐘內執行的處理器指令數。 同時,仿真的速度也取決於仿真本身所運行的系統的性能。 因此,談論模擬器相對於原始系統的“減速”可能更正確。

市面上最常見的全平台模擬器,例如QEMU、VirtualBox或VmWare Workstation,都具有良好的效能。 用戶甚至可能沒有註意到模擬器中正在進行的工作。 這要歸功於處理器中實現的特殊虛擬化功能、二進位翻譯演算法和其他有趣的東西。 這是一篇單獨文章的主題,但簡而言之,虛擬化是現代處理器的一項硬體功能,它允許模擬器不模擬指令,而是將它們直接發送到真實處理器執行,當然,如果架構模擬器和處理器是相似的。 二進位翻譯是將客戶機器代碼翻譯成主機代碼並隨後在真實處理器上執行。 因此,模擬僅稍微慢一些,為 5-10 倍,甚至常常以與真實系統相同的速度運行。 雖然這受到很多因素的影響。 例如,如果我們要模擬一個有幾十個處理器的系統,那麼速度就會立即下降這幾十倍。 另一方面,最新版本的 Simics 等模擬器支援多處理器主機硬件,並有效地將模擬核心並行到真實處理器的核心上。

如果我們談論微架構模擬的速度,那麼它通常是幾個數量級,比在沒有模擬的情況下在普通計算機上執行慢大約 1000-10000 倍。 且邏輯元素層級的實作要慢幾個數量級。 因此,在這個層級使用FPGA作為模擬器,可以顯著提高效能。

下圖顯示了模擬速度對模型細節的近似依賴性。

電腦系統模擬器:熟悉的全平台模擬器和未知的順時針和痕跡

逐節拍模擬

儘管執行速度較低,但微架構模擬器還是很常見。 為了準確地模擬每個指令的執行時間,需要對處理器的內部模組進行模擬。 這裡可能會產生誤解 - 畢竟,看起來為什麼不簡單地對每條指令的執行時間進行程式設計。 但這樣的模擬器將非常不準確,因為同一指令的執行時間可能會因呼叫而異。

最簡單的例子是記憶體存取指令。 如果請求的記憶體位置在快取中可用,則執行時間將是最短的。 如果該資訊不在高速緩存中(「快取未命中」),那麼這將大大增加指令的執行時間。 因此,需要快取模型來進行準確的模擬。 然而,問題並不限於快取模型。 當資料不在高速緩存中時,處理器不會簡單地等待從記憶體中檢索資料。 相反,它將開始執行下一條指令,選擇那些不依賴從記憶體讀取結果的指令。 這就是所謂的「亂序」執行(OOO,亂序執行),是最小化處理器空閒時間所必需的。 對相應的處理器模組進行建模將有助於在計算指令的執行時間時考慮所有這些因素。 在這些指令中,在等待從記憶體讀取結果的同時執行,可能會發生條件跳躍操作。 如果此時條件的結果未知,則處理器不會停止執行,而是進行“猜測”,執行適當的分支並繼續從轉換點主動執行指令。 這樣的區塊稱為分支預測器,也必須在微架構模擬器中實現。

下圖顯示了處理器的主要模組,沒有必要知道它,它只是為了顯示微架構實現的複雜性。

電腦系統模擬器:熟悉的全平台模擬器和未知的順時針和痕跡

真實處理器中所有這些模組的操作都是透過特殊時脈訊號同步的,模型中也是如此。 這種微架構模擬器稱為週期精確的。 其主要目的是準確預測正在開發的處理器的性能和/或計算特定程式的執行時間,例如基準測試。 如果這些值低於要求,則需要修改演算法和處理器模組或最佳化程式。

如上所示,逐時脈模擬速度非常慢,因此僅在研究程式運行的某些時刻時使用,需要了解程式執行的真實速度並評估其設備的未來性能。原型正在被模擬。

在這種情況下,使用功能模擬器來模擬程式的剩餘運行時間。 這種組合使用在現實中是如何發生的? 首先,啟動功能模擬器,在其上載入作業系統和運行所研究程式所需的一切。 畢竟,我們對作業系統本身不感興趣,也不對啟動程式的初始階段、其配置等感興趣。 但是,我們也不能跳過這些部分並立即從中間開始執行程式。 因此,所有這些初步步驟都在功能模擬器上運行。 當程式執行到我們感興趣的時刻後,有兩種選擇。 您可以將模型替換為逐週期模型並繼續執行。 使用可執行程式碼(即常規編譯的程式檔案)的仿真模式稱為執行驅動仿真。 這是最常見的模擬選項。 另一種方法也是可能的——追蹤驅動模擬。

基於軌跡的模擬

它由兩個步驟組成。 使用功能模擬器或在真實系統上,收集程式操作日誌並將其寫入檔案。 該日誌稱為追蹤。 根據所檢查的內容,追蹤可能包括可執行指令、記憶體位址、連接埠號碼和中斷資訊。

下一步是“播放”跟踪,即逐個時鐘模擬器讀取跟踪並執行其中寫入的所有指令。 最後,我們得到了這段程式的執行時間,以及該行程的各種特徵,例如快取中的命中百分比。

使用痕跡的一個重要特徵是確定性,也就是說,透過以上述方式運行模擬,我們一遍又一遍地重現相同的操作序列。 這樣,透過更改模型參數(快取、緩衝區和佇列大小)並使用不同的內部演算法或對其進行調整,就可以研究特定參數如何影響系統效能以及哪個選項提供最佳結果。 所有這些都可以在創建實際的硬體原型之前透過原型設備模型來完成。

這種方法的複雜性在於需要首先運行應用程式並收集跟踪,以及跟踪文件的巨大尺寸。 其優點包括僅模擬感興趣的設備或平台的一部分就足夠了,而透過執行進行模擬通常需要完整的模型。

因此,在本文中,我們研究了全平台模擬的特點,討論了不同層級的實現速度、逐週期模擬和追蹤。 在下一篇文章中,我將描述使用模擬器的主要場景,無論是出於個人目的還是從大公司的開發角度來看。

來源: www.habr.com

添加評論