簡體   English   中英

Linux內核中用於x86架構的中斷處理代碼的位置

[英]Location of interrupt handling code in Linux kernel for x86 architecture

我正在這樣做,試圖在Linux內核中找到實現中斷處理的代碼。 特別是,我試圖找到負責處理系統計時器的代碼。

根據http://www.linux-tutorial.info/modules.php?name=MContent&pageid=86

內核對待中斷的方式與對待異常的方式非常相似:將所有通用目的寄存器放入系統堆棧,並調用一個通用的中斷處理程序。 >將保存當前的中斷優先級並加載新的優先級。 這樣可以防止優先級較低的中斷在處理該中斷時中斷內核。 然后,調用真正的中斷處理程序。

我正在尋找將所有通用寄存器壓入堆棧的代碼,以及通用中斷處理代碼。

至少將通用寄存器推入堆棧是與體系結構無關的,因此我正在尋找與x86體系結構相關的代碼。 目前,我正在查看內核源代碼的3.0.4版本,但是任何版本都可以。 我已經開始在kernel / irq / handle.c中查找,但是看不到任何類似於保存寄存器的內容。 它看起來就像正在調用注冊的中斷處理程序。

32位版本在arch/i386/kernel/entry_32.S ,而64位版本在entry_64.S 搜索標記內核入口點的各種ENTRY宏。

我正在尋找將所有通用寄存器壓入堆棧的代碼

硬件在執行中斷處理程序之前存儲當前狀態(包括寄存器)。 不涉及代碼。 當中斷退出時,硬件將從存儲狀態讀取回狀態。

現在,中斷處理程序中的代碼可以讀取和寫入已保存的寄存器副本,從而在中斷退出時恢復不同的值。 這就是上下文切換的工作方式。


在x86上,硬件僅保存那些在中斷處理程序開始運行之前更改的寄存器。 在大多數嵌入式體系結構上,硬件保存所有寄存器。 造成這種差異的原因是x86有大量寄存器,保存和恢復中斷處理程序未修改的任何內容都是浪費的。 因此,中斷處理程序負責保存和恢復其自願使用的所有寄存器。

請參閱第6-15頁開始的《英特爾®64和IA-32架構軟件開發人員手冊》

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM