linux 中斷相關的幾個問題

2021-09-30 05:32:20 字數 1593 閱讀 3761

一 linux實現的幾個門

intel 提供了三種型別的中斷描述符:任務門,中斷門,陷阱門。linux稍有不同,根據intel的定義,實現了一下幾類門。

1 中斷門

使用者態的程序不能訪問的乙個intel中斷門,dpl = 0。

2 系統門

使用者態的程序可以訪問的乙個intel陷阱門,dpl = 3, 通過系統門可以啟用linux下的三個異常:4,5,128(即0x80)。

3 系統中斷門

使用者態的程序可以訪問的乙個intel中斷門,dpl = 3,中斷異常就屬於系統中斷門,int 0x03。

4 陷阱門

使用者態的程序不能夠訪問的intel陷阱門,dpl = 0.

5 任務門

不能被使用者態程序訪問的intel任務門, dpl = 0。

二 中斷處理函式陣列 interrupt[i]

在entry_32.s中的下面的彙編**,宣告和初始化了interrupt陣列,有幾個細節值得分析。

/*interrupt陣列的宣告和初始化,裡面儲存中斷處理函式的位址*/

/*interrupt陣列就像c語言的陣列一樣,屬於資料段的東西,因此在資料段宣告。但是對陣列的初始化就是**段的內容了,這裡需要注意*/

.data

entry(interrupt)

.text

entry(irq_entries_start)

ring0_int_frame

vector=0

.rept nr_irqs

align

.if vector

cfi_adjust_cfa_offset -4

.endif

1: pushl $~(vector)

cfi_adjust_cfa_offset 4

jmp common_interrupt

.previous      /*previous 知名下面內容上接上乙個段,即data段*/

.long 1b

.text

vector=vector+1

.endr

end(irq_entries_start)

.previous

end(interrupt) /*這句是資料段的內容*/

.previous

可以總結為:

上面一段彙編首先在資料段宣告了乙個interrupt陣列,如下面**:

.data

entry(interrupt)

.long 1b

end(interrupt)

陣列中每個元素的初始值是標號1的位址。因此訪問陣列中的元素時,都會跳到標號1處,執行相應的指令。

還有乙個細節問題:在i8259_32.c中呼叫函式set_intr_gate(vector, interrupt[i]);

這裡引用了在entry_32.s中資料段中定義的全域性的interrupt陣列,但是,資料段中定義的這個intterrupt陣列只能用在連線的時候,這個符號是已經定義過得,至於它的型別和大小等c編譯器無法確定,因此,在hw_irq_32.h中重新宣告了extern void (*interrupt[nr_irqs])(void),這樣c編譯器才會確定這個陣列的型別和大小。

TCP相關的幾個問題

復用tcp報文段裡的序列號部分?傳送資料長度如何確定,傳送方怎麼知道自己該發哪些位元組了?正常傳送資料時應該用哪個標識 tcp報文段裡的頭部長度的作用何在?tcp頭里的關鍵項和作用 疑惑1 復用tcp報文段裡的序列號部分?tcp通過位元組序列號 確認機制來保證資料不丟失,接收方每接收乙個報文段,就要...

Linux中的幾個問題

明天期末考試,就把往年試卷上的敘述題總結一下 1.如果乙個設定使用者id程式未執行任何改變程序的實際使用者id和有效使用者id的系統呼叫,那麼執行該程式的程序,它的實際使用者id和有效使用者id各是什麼?答 實際使用者id在登入時取自口令檔案中的登入項,如果沒有執行任何改變實際使用者id和有效使用者...

幾個問題的

1.寫乙個函式返回引數二進位制中 1 的個數 比如 15 0000 1111 4 個 1 程式原型 int count one bits unsigned int value 解 無符號整型為32位,所以利用迴圈32次,逐個判斷二進位制每一位是不是1 int count one bits unsig...