一 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...