2009-04-21 34 views
4

在英特爾軟件開發人員手冊中,它指出中斷向量32-255通常是用戶爲外部IO設備定義的。在我的系統編程課上,我必須開發一個簡單的設備驅動程序我的問題是如何定義特定中斷向量以用於特定設備?這是用BIOS完成的嗎?如何在x86上識別設備特定的中斷?

注意:我們正在開發一個簡單的操作系統,所以我的情況非常具體,但最終我需要了解這一切是如何發生在x86系統上的。目前我們的系統已經建立,以便將32個以上的中斷向量分配給像串口和鍵盤這樣的設備。在閱讀英特爾82801EB ICH5 IO控制器的數據表時,特別是關於8259 PIC的部分,它表示IRQ15是次要IDE通道。最終如何將它作爲中斷向量放在堆棧上?

我可能只是很困惑,這個問題沒有意義,所以我提前道歉。編輯:所以我們的系統編程類有一個非常簡單的操作系統,它有內核例程安裝ISR來處理特定的中斷給定的向量編號。在我們上個季度的課上,教授給了我們一個頭文件,它將鍵盤定義爲向量編號0x2c或類似的東西。我正試圖找出如何使用我們的內核例程將主要和/或次要IDE通道中斷映射到各種ISR。目前,所有未使用的中斷向量都有一個默認處理程序,如果發生中斷,它將打印消息,所以IDE中斷目前還沒有開啓,但這是另一個問題。

+0

你的問題是有道理的。我隱約記得鼠標使用I​​RQ 31?抱歉。我沒用。 – 2009-04-21 15:36:24

+0

我想我剛剛找到一個很好的資源: http://heim.ifi.uio.no/~stanisls/helppc/int_table.html http://heim.ifi.uio.no/~stanisls/helppc/8259 .html – 2009-04-21 17:12:08

回答

0

好吧,我似乎在我們的支持代碼中找到了答案,特別是PIC初始化例程。使用以下代碼,IRQ行分別映射在主控和從屬PIC的IDT的偏移20h和28h處。

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb(PIC_MASTER_IMR_PORT, 0x20); 
__outb(PIC_SLAVE_IMR_PORT, 0x28); 

這意味着,鍵盤被分別映射到向量號2c和主通道和次通道將被映射到2E和2F。如果我提出了更好的問題,你們中的一些人可能會給我更好的答案,但無論如何,我都很感激幫助!

82801EB ICH5數據表的表45詳細說明了8259的IRQ線路,而在我的操作系統中,主器件只是在偏移20h加載,從器件是28h。

謝謝!

0

我記得有一個向量表在內存空間的開始處指向特定中斷髮生時調用的例程。在這裏我可能會達到太低的水平(舊的x86彙編程序員),但是在基本級別,您將該向量安裝在該表中,然後調用您的例程。我還沒有收到我的任何舊參考資料,所以不能給你實際的電話,但如果官方方法在BIOS之外操作,我會感到驚訝。

在這些GUI的日子裏,我確信還有其他更合適的方法,允許中斷共享和所有好東西。

編輯:忽略了很多,我剛纔看到你正在看中斷16和以上的硬件中斷之外。在這個空間中有任何有趣的硬件之前,我已經離開了這個程序級別,所以我只處理過前15個IRQ(第16個是控制器之間的級聯)。我離開它只是爲了防止其他人感興趣:)

1

我已經處理了這些東西,所以這可能是關閉了一段時間:我記得PC中斷控制器有15條IRQ線。這些映射到特定的相鄰x86中斷向量。所以當一個外設觸發一個IRQ線時,PIC會中斷CPU並告知要跳轉到哪個向量,就好像執行了相應的INT指令一樣。某些IRQ被硬編碼爲某些外設,但我相信PCI設備會與OS協商IRQ和其他一些資源(就像傳統ISA PnP設備一樣)。

我不明白你的意思是'最終如何將它作爲中斷向量放在堆棧上?'

+0

我的意思是,我如何識別給予內核的中斷向量是主IDE通道?正如你所說,如果一個IDE通道觸發其各自的IRQ線,那麼我如何知道哪個向量號與作爲源的IDE通道相關聯? – 2009-04-21 16:56:11

1

您可以編程PIC(可編程中斷控制器)來映射某些設備IRQ。

在x86上,有兩個菊花鏈連接的PIC給IRQ0-IRQ17。 IRQ0-7由8259和IRQ8-15通過第二個8259進行管理。第一個通知CPU並且是主設備,第二個(從設備)通知第一個。

IDT(中斷描述符表)將中斷映射到ISR(中斷服務例程)的地址。 INT指令(軟件陷阱)可以直接引發中斷。

例如,要引發中斷0x80,請執行INT 0x80

要處理0x80,mov [0x80*4], int_80_handler。假設32位體系結構,int_80_handler函數的地址現在存儲在IDT中的第0x80位置。

你會發現這些有用的:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en.wikipedia.org/wiki/Interrupt_descriptor_table

1

有一個設備兩種可能的方式來獲得中斷:

  1. 使用即插即用Play或Pci機制。如果你這樣做,BIOS會調用你的外圍設備並詢問資源需求。之後,您的驅動程序可以枚舉即插即用設備,搜索支持的設備並從設備獲取硬件中斷。

  2. 早期是如何做的:只用一箇中斷。在設備中添加一個dip開關,允許用戶在不同的中斷之間進行選擇。資源分配現在在用戶的手中。用戶也會在加載時以某種方式將中斷號傳遞給驅動程序。

現在如何掛鉤中斷:這取決於操作系統和86在運行模式上對於裸體,裸骨系統,您可以通過一個特殊的指令查詢IDT(中斷描述符表)。一旦你有了這個IDT,你就可以得到地址,並將IRQ處理程序的地址戳到正確的插槽中。對於真實模式,我不知道它是如何完成的。

如果你至少有一點實時操作系統或類似操作系統的運行,很可能已經有一個內核函數爲你做了很多工作。

0

INT 21h/AH = 25h - 設置中斷向量; 輸入:AL =中斷號碼。 DS:DX - >新的中斷處理程序。