c語言interrupt函數,中斷處理函數數組interrupt[]初始化

在系統初始化期間,trap_init()函數將對中斷描述符表IDT進行第二次初始化(第一次只是建一張IDT表,讓其指向ignore_intr函數),而在這次初始化期間,系統的0~19號中斷(用于分NMI和異常的中斷向量)均被設置好。與此同時,用于系統調用的0x80號向量也已被設置。

然而,對于外部中斷的初始化 卻沒有在這個函數中進行。而是在函數init_IRQ中。

仔細想一想內核這樣做,的確是使代碼清晰又有條理。

1)trap_init -----> 內部中斷異常和NMI(中斷向量號:0~19)

2)?init_IRQ?? -----> 外部可屏蔽中斷??(中斷向量號:32~127,129~238)

在init_IRQ函數中,對IDT中斷描述符表進行了第三次完善(把相應的外部中斷對應的中斷向量進行填充)

410 for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {

411 int vector = FIRST_EXTERNAL_VECTOR + i;

412 if (i >= NR_IRQS)

413 break;

414 if (vector != SYSCALL_VECTOR)

415 set_intr_gate(vector, interrupt[i]);

416 }

上述代碼解釋:

FIRST_EXTERNAL_VECTOR = 0x16;

設置中斷向量號32---NR_IRQS相應的中斷處理程序地址為數組interrupt[i]的內容。(除去128號中斷向量,已經這個向量號已經被用于系統調用)。

我們看一下interrupt數組的定義:這段程序時用匯編寫的。

540 .data

541 ENTRY(interrupt)

542 .text

543

544 vector=0

545 ENTRY(irq_entries_start)

546 RING0_INT_FRAME

547 .rept NR_IRQS

548 ALIGN

549 .if vector

550 CFI_ADJUST_CFA_OFFSET -4

551 .endif

552 1: pushl $~(vector)

553 CFI_ADJUST_CFA_OFFSET 4

554 jmp common_interrupt

555 .data

556 .long 1b

557 .text

558 vector=vector+1

559 .endr

上面的代碼開起來很亂,我們整理一下,使其更加易讀,但是又不失其本質。

.data

ENTRY(interrupt)

.long 1b //注意 如果把數據段放在這里那么1b要改為1f了,而且失去循環執行NR_IRQS次的功能。???????????????????? //我們只能人為的把他們想象成被循環執行了NR_IRQS次 :)

.text

vector=0

ENTRY(irq_entries_start)

.rept NR_IRQS

1: pushl $~(vector)

jmp common_interrupt

vector=vector+1

我們把數據段放在一起,代碼段放在一起。注意這里的代碼段是用來初始化數據段的。

我們看到:interrupt作為一個內存標簽,其內容為代碼段標號1所表示的地址。同時我們也注意到這個interrupt數組的所有項的內容都是一樣的:全部為“標號1”的符號地址。

每次外部中斷來臨時,硬件自動根據PIC或者APIC送出來的中斷類型碼(中斷向量號)去查找中斷描述符表的相應項,然后得到interrupt[n]的內容,繼而轉去執行標號1地址的代碼,而標號1的代碼僅將中斷號取反后壓入棧中,后立馬跳到common_interupt標號處去執行。至于為什么要把中斷向量號取反后壓棧,則是由于內核用正的相應號去表示系統調用號,用負號來表示中斷號。

細心的你有可能發現了一個問題:上述代碼片段只是向interrupt表示的內存地址處存入大量重復的4字節數據,卻沒有象C語言定義數組那樣定義interrupt[NR_IRQS-1],那么set_intr_gate這樣的函數是如何確切的指導interrupt是一個數組呢,而且數組的內容是函數指針?

例如:set_intr_gate(vector,interrupt[i]);是如何取interrupt[i]內容呢?

啰嗦了這么半天...

如下一個聲明就搞定了。[])(void);//函數指針數組

566 common_interrupt:

567 SAVE_ALL

568 TRACE_IRQS_OFF

569 movl %esp,%eax

570 call do_IRQ

571 jmp ret_from_intr

572 CFI_ENDPROC

common_interrupt首先執行宏SAVE_ALL保存中斷處理程序可能用到的寄存器(注意:cs eip ss esp由硬件自動保存)然后把棧頂指針傳給eax寄存器后(eax寄存器內容將作為do_IRQ函數的參數)調用do_IRQ進行中斷處理,返回后

執行ret_from_intr從中斷返回。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378332.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bytevalue_Java Number byteValue()方法與示例

bytevalueNumber類byteValue()方法 (Number Class byteValue() method) byteValue() method is available in java.lang package. byteValue()方法在java.lang包中可用。 byteValue() method is used to return the value denoted by this Number object converted to type byt…

第二章 染色熱力學理論單元測驗

1,()測定是染色熱力學性能研究的基礎 吸附等溫線。 2,吸附是放熱反應,溫度升高,親和力() 減小 3,染色系統中包括() 染料。 染深色介質。 染色助劑。 纖維。 4,下列對狀態函數特點敘述正確的為() 狀態函數只有在平衡狀態的系統中才有確定值。 在非平衡狀態的系統…

使用鳶尾花數據集實現一元邏輯回歸、多分類問題

目錄鳶尾花數據集邏輯回歸原理【1】從線性回歸到廣義線性回歸【2】邏輯回歸【3】損失函數【4】總結TensorFlow實現一元邏輯回歸多分類問題原理獨熱編碼多分類的模型參數損失函數CCETensorFlow實現多分類問題獨熱編碼計算準確率計算交叉熵損失函數使用花瓣長度、花瓣寬度將三種鳶…

開源HTML5應用開發框架 - iio Engine

隨著HTML5的發展&#xff0c;越來越多的基于HTML5技術的網頁開發框架出現&#xff0c;在今天的這篇文章中&#xff0c;我們將介紹iio Engine&#xff0c;它是一款開源的創建HTML5應用的web框架。整個框架非常的輕量級&#xff0c;只有45kb大小&#xff0c;并且整合了debug系統&…

c語言double root,C語言修仙

root(1)(2/2)AD1AD4林潯合理推測&#xff0c;青城山劍宗&#xff0c;也就是祁云所在的劍修一脈&#xff0c;掌握著一些道修并不知道的傳承。譬如——怎樣找到赤霄龍雀劍&#xff0c;又或者&#xff0c;怎樣使用它。這樣一來&#xff0c;青城的守衛陣法沒有反應也能解釋了&#…

【轉】Black Box

Introduction BlackBox是FPGA設計中一個重要的技巧&#xff0c;不過覺得Xilinx的文檔沒有很好地將它講清楚。 BlackBox的主要想法就是把設計的某一個子模塊單獨綜合&#xff0c;綜合的結果作為一個黑盒子子模塊&#xff0c;上層設計不再對這個模塊進行優化&#xff0c;只能看到…

Java Compiler disable()方法與示例

編譯器類disable()方法 (Compiler Class disable() method) disable() method is available in java.lang package. disable()方法在java.lang包中可用。 disable() method is used to cause the compiler to stop operation. disable()方法用于使編譯器停止操作。 disable() m…

【神經網絡計算】——神經網絡實現鳶尾花分類

本blog為觀看MOOC視頻與網易云課堂所做的筆記 課堂鏈接&#xff1a; 人工智能實踐:TensorFlow筆記 吳恩達機器學習 疑問與思考 為什么按照batch喂入數據 之前看的視頻里面處理數據都是一次性將所有數據喂入&#xff0c;現在看的這個視頻對數據進行了分組投入。這是為何&#…

第三章 染色動力學理論單元測試

1,準二級動力學模型認為,染色速率與()的二次方成正比 纖維上未被占滿的位置(空位)數量 2,研究染色動力學的意義有() 了解染料走向平衡的速率。 初染速率。 勻染性。 3,求出染料的擴散系數的意義有() 了解各因素對擴散系數的影響。 求出不同溫度下的擴散系數,計算…

CDOJ--1668

原題鏈接&#xff1a;http://acm.uestc.edu.cn/problem.php?pid1668 由于題目意思指的是將分數拆分成不同的單位分數之和&#xff0c;所以就不用考慮將2/3拆成1/31/3這種情況了&#xff1b;又由于好的拆分要求項數即len要少&#xff0c;最小的項要大&#xff0c;故可以采用迭代…

c# xaml語言教程,c#學習之30分鐘學會XAML

1.狂妄的WPF相對傳統的Windows圖形編程&#xff0c;需要做很多復雜的工作&#xff0c;引用許多不同的API。例如&#xff1a;WinForm(帶控件表單)、GDI(2D圖形)、DirectXAPI(3D圖形)以及流媒體和流文檔等&#xff0c;都需要不同的API來構建應用程序。WPF就是看著上面的操作復雜和…

(Android實戰)AsyncTask和Handler兩種異步方式實現原理和優缺點比較

1 AsyncTask實現的原理,和適用的優缺點 AsyncTask,是android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現異步操作,并提供接口反饋當前異步執行的程度(可以通過接口實現UI進度更新),最后反饋執行的結果給UI主線程. 使用的優點: l 簡單,快捷 l 過程可控 使用的缺點…

Java Collections list()方法與示例

集合類list()方法 (Collections Class list() method) list() method is available in java.util package. list()方法在java.util包中可用。 list() method is used to return an array list that contains all the elements returned by the given Enumeration and the way o…

第八章 異常

第八章 異常 異常事件可能是錯誤&#xff08;如試圖除以零&#xff09;&#xff0c;也可能是通常不會發生的事情。 Python提供功能強大的替代解決方案——異常處理機制。 異常是什么&#xff1f; Python使用異常對象來表示異常狀態&#xff0c;并在遇到錯誤時引發異常。異常…

hdu 1564 Play a game

對于本題&#xff0c;若要當前的 player 贏&#xff0c;剩下所走的步數必須是奇數步。所以對于每步的 player 所放棄的選擇的步數為偶數步。因此&#xff0c;對于整個 game 來說&#xff0c;所放棄的步數 m 為偶數步&#xff0c;設所走的步數為 k &#xff0c;則 n*n-1mk&…

【電設控制與圖像訓練題】【激光打靶】【opencv測試代碼以及效果】

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 規則 激光槍自動射擊裝置(E題) 【本科組】 一、任務 設計一個能夠控制激光槍擊發、自動報靶及自動瞄準等功能的電子系統。該…

.NET 小結之內存模型

.NET 小結之內存模型 為什么要解.NET 的內存模型 在.NET下的內存管理、垃圾回收其實大部分不需要我們操心&#xff0c;因為大部分.NET已經幫我們做了&#xff0c;通常情況下也不需要考慮這些。但是如果想要了解一些.NET一些稍微“底層”的原理&#xff0c;如&#xff1a;“裝箱…

C ++ STL中的set :: upper_bound()函數

C STL set :: upper_bound()函數 (C STL set::upper_bound() function) set::upper_bound() function is a predefined function, it is used to get the upper bound of any element in a set. set :: upper_bound()函數是預定義的函數&#xff0c;用于獲取集合中任何元素的上…

c語言if不能判斷u8變量值,C語言變量名命規則.doc

C語言變量名命名規則一、程序風格&#xff1a;???????? 1、嚴格采用階梯層次組織程序代碼&#xff1a;???????? 各層次縮進的分格采用VC的缺省風格&#xff0c;即每層次縮進為4格&#xff0c;括號位于下一行。??? 要求相匹配的大括號在同一列&#xff0c;對…

【電設控制與圖像訓練題】【激光打靶】【openmv測試代碼以及效果】

9.4加入串口通訊,送出靶心坐標、激光坐標、激光所在環數、方位;加入防誤判操作 博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 目錄 規則坐標系代碼總結相關openmv使用文…