2013-02-06 58 views
3

是否可以通過用戶程序模擬硬件中斷? 我看過這個問題很多次,但總是沒有回答。鍵盤發送中斷給CPU嗎?

我想知道低級別的中斷(例如模擬鍵盤上按鍵時的情況,以便鍵盤驅動程序會中斷中斷)。

高級別活動和API是外範圍,問題比實際相當的理論(以防止「爲什麼」的討論:)

+0

那麼,你可以修改OS內核,以便你可以從用戶空間手動調用中斷*處理程序*。 – us2012

+0

如果你可以訪問中斷向量,你應該能夠找到中斷的處理位置,然後在那裏調用。當然,您需要擁有特權用戶權限,也許需要編寫一些彙編程序。在intel x86機器上是 –

+0

是的。在別人身上,我不知道。 http://en.wikipedia.org/wiki/INT_(x86_instruction)你需要有正確的權限才能做到這一點。 – thang

回答

5

是,也不是。

在x86 CPU上(舉一個例子),有一個int指令產生一箇中斷。一旦中斷產生,CPU不一定會區分由硬件產生的中斷和由軟件產生的中斷。例如,在原始的PC BIOS中,IBM選擇了一個會導致執行print-screen命令的中斷。他們選擇的中斷(中斷5)是當時並未使用的中斷,但英特爾所說的中斷僅供將來使用。英特爾最終確實把這個中斷使用 - 在286他們增加了一個bound指令,檢查值是否在範圍內,如果不是,則會產生一箇中斷。儘管如此,bound指令基本上不會使用,因爲如果值超出範圍,它將生成中斷5。這意味着(如果您運行的是允許它的類似MS-DOS的東西),執行bound指令的值超出界限將打印屏幕。

但是,在現代操作系統上,這通常不被允許。所有的中斷產生和處理髮生在內核中。硬件有4級保護(「環」),並支持指定可以執行指令的環。如果您嘗試從第3環運行的代碼執行它,它將不會直接執行 - 相反,執行將切換到操作系統內核,該操作系統內核可以按照它選擇的方式對待它。

這允許(例如)視窗以模擬MS-DOS,所以MS-DOS程序(其使用int指令)可以在虛擬機中執行,具有虛擬化的輸入和輸出,所以即使他們「認爲「他們直接使用鍵盤和屏幕硬件,他們實際上是使用軟件提供的模擬。然而,對於「本地」程序,使用大多數int指令(即用於與內核進行通信的任何數量的中斷)只會導致程序關閉。底線:是的,硬件支持它 - 但硬件也支持禁止它,幾乎每個現代操作系統都會這樣做,至少對於操作系統內核本身以外的大多數代碼。


  1. 雖然與典型的硬件,中斷處理程序可以從可編程中斷控制器讀取數據(PIC)芯片,這將告訴它的中斷是否通過PIC來到(即硬件中斷)否(軟件中斷)。大多數硬件還支持至少一些只能由硬件生成的中斷,如x86上的NMI。儘管這些通常只用於相當狹窄的用途(例如,PC上的NMI通常用於存儲器奇偶校驗錯誤等)。
+0

謝謝!我能再問一個相關的問題嗎,是否有低水平的機會來模擬HID設備事件?例如在OS X上有'CGEventPost',但是有可能以某種方式在較低級別上進行事件嗎? – asdf

+0

@dig:根據您想要的低級別,您可能可以使用'SendInput','keybd_event','mouse_event'或(如果您想實現低級別)合成輸入的設備驅動程序。 –