是否可以通過用戶程序模擬硬件中斷? 我看過這個問題很多次,但總是沒有回答。鍵盤發送中斷給CPU嗎?
我想知道低級別的中斷(例如模擬鍵盤上按鍵時的情況,以便鍵盤驅動程序會中斷中斷)。
高級別活動和API是外範圍,問題比實際相當的理論(以防止「爲什麼」的討論:)
是否可以通過用戶程序模擬硬件中斷? 我看過這個問題很多次,但總是沒有回答。鍵盤發送中斷給CPU嗎?
我想知道低級別的中斷(例如模擬鍵盤上按鍵時的情況,以便鍵盤驅動程序會中斷中斷)。
高級別活動和API是外範圍,問題比實際相當的理論(以防止「爲什麼」的討論:)
是,也不是。
在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
指令(即用於與內核進行通信的任何數量的中斷)只會導致程序關閉。底線:是的,硬件支持它 - 但硬件也支持禁止它,幾乎每個現代操作系統都會這樣做,至少對於操作系統內核本身以外的大多數代碼。
謝謝!我能再問一個相關的問題嗎,是否有低水平的機會來模擬HID設備事件?例如在OS X上有'CGEventPost',但是有可能以某種方式在較低級別上進行事件嗎? – asdf
@dig:根據您想要的低級別,您可能可以使用'SendInput','keybd_event','mouse_event'或(如果您想實現低級別)合成輸入的設備驅動程序。 –
那麼,你可以修改OS內核,以便你可以從用戶空間手動調用中斷*處理程序*。 – us2012
如果你可以訪問中斷向量,你應該能夠找到中斷的處理位置,然後在那裏調用。當然,您需要擁有特權用戶權限,也許需要編寫一些彙編程序。在intel x86機器上是 –
是的。在別人身上,我不知道。 http://en.wikipedia.org/wiki/INT_(x86_instruction)你需要有正確的權限才能做到這一點。 – thang