在系統初始化或啓動代碼級別需要禁用所有中斷。如果我不禁止中斷會發生什麼?爲什麼我們需要在系統啓動或系統初始化時禁用所有中斷?
5
A
回答
6
有些情況下中斷是不需要的,所以它們被禁用。
的例子有很多,但是從我的頭頂,我能想出這些:的ss:(e)sp
修改。如果中斷被觸發,
flags
寄存器被壓入堆棧。一個無效的堆棧值會將該副本移動到某個隨機位置。更改ss:(e)sp
至少在x86上不是原子的,因爲它由多條指令組成,因此中斷可以在兩者之間觸發。
但是,如果您正確編寫代碼,則可以在不禁用中斷的情況下實現相同的原子性,因爲它們是automatically disabled on certain occasions。@MichaelPetch發出約8088個處理器(8086,第一個x86處理器的「軟弱的弟兄」),描繪了一個例外,這些一些特殊「某些特定場合,」在評論這個答案:
即大約被關斷的中斷,直到下一個 指令結束(移動一個值
SS
之後),但也有8088個 處理器,其中所述中斷沒有正確關閉 一個SS
改變之後的錯誤是真實的。我們這些人(恐龍)經常會將CLI
/STI
圍繞SS:SP
更新,以防萬一(運行8088 系統時有這樣的錯誤的機率可能接近於零)。從歷史 的角度來看,這個PC mag article可能會揭示這個古老的問題。(代碼格式化加入。)的IDT/IVT的
- 缺失。在保護模式IDT被初始化或16位實模式IVT被修改(或清零或某物)時,中斷將跳轉到一些沒有指令位於的存儲器位置。
一般來說,可以說操作以某種非原子方式修改IDT/IVT需要禁用中斷。
順便說一句:我自己已經寫了一些引導加載程序,通常在整個引導程序的整個運行時禁止中斷。在保護模式下,我最終重新啓用它們。 Linux 4.2以類似的方式處理它。如果您有興趣,請閱讀其源代碼(/arch/x86/boot/
)或Minix的源代碼!
相關問題
- 1. 爲什麼多處理器系統需要禁用中斷
- 2. 爲什麼我們需要在有時啓用A20時禁用中斷?
- 3. 哪個核心在系統啓動時首先初始化?
- 4. 爲什麼我們需要文件系統的目錄結構?
- 5. 我需要在android系統
- 6. hybris系統初始化和更新有什麼區別?
- 7. 在操作系統中,系統調用和中斷有什麼區別?
- 8. 爲什麼我們需要刻錄成根文件系統在嵌入式系統開發
- 9. 爲什麼我需要初始化?
- 10. Titan/JanusGraph管理系統需要什麼?
- 11. 爲什麼我們需要特殊的設備驅動程序來使用iSCSI HBA啓動操作系統?
- 12. 初始化腳本沒有運行系統重啓/關機
- 13. 在系統啓動時啓動Rails
- 14. 在系統啓動時啓動Rundeck
- 15. SMP系統上的內核初始化
- 16. HTML5文件系統初始化
- 17. 配置系統無法初始化
- 18. 如何初始化文件系統?
- 19. 視頻系統未初始化pygame的
- 20. pygame.error:視頻系統未初始化
- 21. Log4J警告:初始化log4j系統
- 22. 配置系統無法初始化
- 23. 配置系統faild初始化,c#,vs2010
- 24. System.Configuration.ConfigurationErrorsException:'配置系統初始化失敗'
- 25. NLog配置系統初始化失敗
- 26. log4j:WARN請正確初始化log4j系統
- 27. pygame.error:視頻系統未初始化
- 28. 配置系統初始化失敗
- 29. Pygame - 攪拌機系統未初始化
- 30. 爲什麼我需要初始化varible類時,我想用它
您必須因爲您的中斷處理程序尚未安裝。如果你不禁止它們,並且你得到一箇中斷,系統/啓動將崩潰。 –
您不希望中斷在安裝相應處理程序之前觸發,並且處理程序使用的所有數據結構都已初始化。否則你可能不會得到不可預知的行爲。 –
如果您正在編寫實模式OS,則可能不需要禁用中斷。有關BIOS /硬件的默認實模式中斷表將適用。如果您打算創建保護模式操作系統,則需要在切換到保護模式之前禁用中斷。如果在中斷打開的情況下切換到保護模式,並且沒有中斷向量表(IVT),則可能會出現三重故障。一旦進入保護模式,您可以設置IVT,然後重新啓用中斷。 –