2017-09-15 43 views
0

我已閱讀「英特爾軟件開發人員手冊」第3卷第20節,其中介紹了虛擬8086模式的工作原理,包括使用VIF和VIP標誌。不過,我仍然對一些事情感到困惑。使用x86 VIF和VIP標誌?

VIF標誌用作IF標誌的替代品,因此即使它仿真的實模式程序不希望8086仿真程序(可能是某些用戶空間程序)可以接收可屏蔽的硬件中斷至。

  1. 爲什麼模擬器想要這樣做?

VIP被用作標記何時收到中斷的空間。根據手冊,如果處理器接收到一個可屏蔽的中斷,但被仿真的程序不想接收它們(所以VIF標誌將被清除),仿真器應該設置VIP標誌,等待仿真程序設置IF標誌,然後處理中斷。

  1. 爲什麼我們要等待處理中斷而不是立即處理呢?實模式8086上的中斷是否被延遲而不是被忽略?

  2. 附加問題 - 處理器在VIP被設置並且程序啓用中斷(通過STI等)時生成#GP,但是可以在多種方式設置VIP標誌時生成#GP,例如,通過無效的內存訪問。該手冊沒有提及檢查#GP的原因是什麼,所以程序是否應該處理掛起的中斷,而不管IF是否被設置?

編輯:好了,我看到了我的一部分混亂,它是內核這需要保持IF集。在這種情況下,我應該問#2,爲什麼我們要等待處理中斷而不是完全忽略它?

+0

虛擬8086模式運行16位代碼本地*。它不模擬,它虛擬化。 ** vm86環境需要能夠在不停止內核主機操作系統接收中斷的情況下禁用中斷**在Linux,IIRC上,vm86模式通過讓內核與用戶空間幫助程序協作來處理仿真部分不需要在內核中。(當然,這隻適用於32位內核; vm86模式不適用於64位內核)。 –

+2

@PeterCordes:啊,我明白了,所以問題不在於* emulator *接收中斷,而是* kernel *。現在我意識到這一點,似乎這就是手冊明確說的,但我沒有足夠的注意力去實現它。 – ObsequiousNewt

回答

3
  1. 這樣做的原因是覆蓋在部分20.3.2:「現有的8086個方案通常設置和清除IF標誌EFLAGS寄存器來啓用和禁用可屏蔽硬件中斷。」在現代操作系統下以virtual-8086模式運行這樣的應用程序時,操作系統不會允許8086程序禁用系統中的中斷。因此,IF標誌需要保持在操作系統的控制之下,並且必須代表虛擬8086程序進行虛擬化。使用VIF和VIP標誌「消除了所有與IF相關的操作(如PUSHF,POPF,CLI和STI指令)的需要,以便捕獲到虛擬8086監視器。」

  2. 如果中斷已經執行CLI來清除IF(具有清除VIF的效果),則無法將其傳遞給虛擬8086模式程序。

  3. 這是一個很好的問題。在我看來,處理器應該在生成#GP之前設置VIF;那麼虛擬8086監視器中的GP處理程序可以很容易地看到VIP和VIF都已設置。這是描述當VIF由POPF或IRET設置時的行爲;我不知道STI爲什麼會有不同的表現。

+0

Re#2:不是清除虛擬8086程序忽略中斷的IF標誌嗎?或者「忽略」其實是否意味着「推遲」? – ObsequiousNewt

+0

是的,被屏蔽的中斷被延期,而不是被丟棄。 – prl

+0

啊,我現在明白了。謝謝! – ObsequiousNewt