我需要以原子方式執行一段代碼。我想唯一的辦法是禁用中斷,我怎麼能在Windows下做到這一點?我正在尋找一個允許我這樣做的Windows操作系統,所以我不專注於特定的窗口。即使Windows CE也不錯。禁用窗口中的中斷
斯特凡諾
我需要以原子方式執行一段代碼。我想唯一的辦法是禁用中斷,我怎麼能在Windows下做到這一點?我正在尋找一個允許我這樣做的Windows操作系統,所以我不專注於特定的窗口。即使Windows CE也不錯。禁用窗口中的中斷
斯特凡諾
完全禁止中斷相當多用戶編寫的代碼的概念跟Windows的某些基本的設計假設。
對於初學者,您不能禁用來自用戶模式應用程序的中斷。 (這是一條特權指令。)
在內核模式下,可以使用IRQL來防止大多數premption(但不是全部)。這是在Windows下執行不可搶佔硬件操作的「標準」方法。我懷疑這是你真正想要的。如果你能讓你的代碼在更高級別的IRQL的範圍內運行,你應該沒問題。 See this link for info on IRQL. 請記住,你跑得越高,就會有更多的事情要打破。期望性能計數器變得不準確,設備緩衝區溢出等。
作爲後門,您可以將原始程序集CLI/STI指令嵌入到內核驅動程序中,但這可能會破壞很多東西,除非您的代碼禁用中斷很短的時間。如果沒有,請期待藍屏。另外,我相信AMD64編譯器會對你進行內聯彙編。
我強烈建議您退出您的原子性要求。
其他一些選項:
此外,還有約86一個骯髒的小祕密,你應該知道:你在x86平臺上編寫幾乎沒有什麼是保證是原子,即使你寫在你的裝配RTOS。有系統管理中斷可能會中斷您的代碼,即使您執行CLI/STI。
在桌面和更高版本的Windows上,您不能禁用來自用戶空間應用程序的中斷。如果你真的認爲你需要 - 那麼你應該重新考慮設計。至於CE和手機 - 我沒有任何信息,但我懷疑有同樣的情況。你正在開發什麼樣的驅動程序? – Serge
我不需要留在用戶空間中,可以禁用在內核級別創建某些內容的中斷?也許是軟件驅動程序? – user1430869
你能更精確一點嗎?你將用什麼資源來防止這種錘子的併發訪問:)? – Serge