2012-09-27 27 views
2

我需要以原子方式執行一段代碼。我想唯一的辦法是禁用中斷,我怎麼能在Windows下做到這一點?我正在尋找一個允許我這樣做的Windows操作系統,所以我不專注於特定的窗口。即使Windows CE也不錯。禁用窗口中的中斷

斯特凡諾

+1

在桌面和更高版本的Windows上,您不能禁用來自用戶空間應用程序的中斷。如果你真的認爲你需要 - 那麼你應該重新考慮設計。至於CE和手機 - 我沒有任何信息,但我懷疑有同樣的情況。你正在開發什麼樣的驅動程序? – Serge

+0

我不需要留在用戶空間中,可以禁用在內核級別創建某些內容的中斷?也許是軟件驅動程序? – user1430869

+0

你能更精確一點嗎?你將用什麼資源來防止這種錘子的併發訪問:)? – Serge

回答

1

完全禁止中斷相當多用戶編寫的代碼的概念跟Windows的某些基本的設計假設。

對於初學者,您不能禁用來自用戶模式應用程序的中斷。 (這是一條特權指令。)

在內核模式下,可以使用IRQL來防止大多數premption(但不是全部)。這是在Windows下執行不可搶佔硬件操作的「標準」方法。我懷疑這是你真正想要的。如果你能讓你的代碼在更高級別的IRQL的範圍內運行,你應該沒問題。 See this link for info on IRQL. 請記住,你跑得越高,就會有更多的事情要打破。期望性能計數器變得不準確,設備緩衝區溢出等。

作爲後門,您可以將原始程序集CLI/STI指令嵌入到內核驅動程序中,但這可能會破壞很多東西,除非您的代碼禁用中斷很短的時間。如果沒有,請期待藍屏。另外,我相信AMD64編譯器會對你進行內聯彙編。

我強烈建議您退出您的原子性要求。

其他一些選項:

  • 引導到自己的環境中運行測試(類似的Memtest86)。
  • 考慮使用父RTOS內核。有現成的「Windows RTOS」解決方案將Windows作爲父RTOS的子進程運行。現有的Windows應用程序和驅動程序運行正常,並且爲RTOS編寫時間關鍵/原子任務。該空間中最受歡迎的球員是RTX from IntervalZero

此外,還有約86一個骯髒的小祕密,你應該知道:你在x86平臺上編寫幾乎沒有什麼是保證是原子,即使你寫在你的裝配RTOS。有系統管理中斷可能會中斷您的代碼,即使您執行CLI/STI。