我想知道,如何在我用C++編寫的內核中啓用IRQ8(RTC)。 我已經有用於安裝中斷處理程序的模塊。 但安裝IRQ8中斷處理程序後,它不會產生任何中斷。 那麼我怎樣才能啓用IRQ8?並啓用後它會產生什麼中斷? 我知道RTC產生INT 70h中斷,但我正在安裝RTC中斷處理程序 int 29h在IDT。所以它不起作用。如何在我的操作系統內核中啓用IRQ8?
請幫忙。
謝謝。
我想知道,如何在我用C++編寫的內核中啓用IRQ8(RTC)。 我已經有用於安裝中斷處理程序的模塊。 但安裝IRQ8中斷處理程序後,它不會產生任何中斷。 那麼我怎樣才能啓用IRQ8?並啓用後它會產生什麼中斷? 我知道RTC產生INT 70h中斷,但我正在安裝RTC中斷處理程序 int 29h在IDT。所以它不起作用。如何在我的操作系統內核中啓用IRQ8?
請幫忙。
謝謝。
我假設你正在使用基於x86的體系結構,如果是這樣,那麼你也正在使用8259A可編程中斷控制器。如果是這種情況,IRQ8位於第二個從屬PIC上,它通常通過主PIC上的IRQ2連線。您基本上必須在主PIC上編程IRQ2才能接收來自從器件PIC的級聯INT信號。接下來,您將不得不揭露第二個從屬PIC上的任何屏蔽中斷,在這種情況下,該中斷將是IRQ8,其中RTC中斷通常是連線的。
用於控制這兩個的PIC的端口可以0x020
和0x21
用於主PIC,以及0xA0
和0xA1
用於從屬PIC中找到。有四種不同的ICW
或初始化命令字可用於對這兩個PIC進行編程。爲了設置級聯,您需要將ICW1發送到端口0x20
的主PIC,並將第二位設置爲1
,以便告訴PIC它處於級聯模式。然後,您需要將ICW3值0x02
寫入端口0x21
,以告訴主控制器PIC將從從器件PIC接收第二個引腳上的從器件INT信號。最後,您需要編程正確的ICW到第二個從器件PIC0xA0
和0xA1
,以便在IRQ8(即從器件的第一個中斷引腳)上取消屏蔽並啓用RTC。您也可以在此時編程從PIC以向中斷處理程序所在的IDT請求適當的中斷值偏移量。
關於如何正確發送ICW(初始化命令字)以及OCW(操作命令字)到每個PIC的各自端口,有相當多的文檔。很多這些命令都是順序的,這意味着您需要按照特定順序執行幾個步驟,因爲有4個ICW和3個OCW,但是您只將它們寫入每個PIC的兩個8位端口。有關每種類型的位掩碼的快速參考,可以參考http://stanislavs.org/helppc/8259.html,但如果您不熟悉編程端口等,我會建議您尋找一些其他文檔。例如,編程端口需要一些彙編... if你可以做一些包裝,但是你需要x86 IN
和OUT
彙編命令,以及控制特定的寄存器,如AX
,AL
和DX
來讀寫一個端口。
最後,如果以上都沒有效果,你可能需要實際解析英特爾MP表,以弄清楚你的平臺是如何連接起來......
感謝您的回覆。我的問題仍然沒有解決。我在29h入口處安裝了IDT的irq8中斷處理程序,並且我能夠啓用irq8,但是irq8生成中斷70h,因此它不適用於我。 –
我有個querry能不能請你解釋一下。我在21h入口處安裝了IDT的irq1中斷處理程序。但根據這個文檔
一旦你重新編程PIC爲IRQ發送另一箇中斷向量,你幾乎可以去任何你想要的鍵盤或其他任何有效的IDT條目。由於BIOS正常使用的第一對中斷是爲處理器異常保留的,所以在進入32位保護模式時始終進行此操作。所以雖然PIC可能會發送一個矢量值,但您始終可以編程它以發送其他內容。這可以通過將正確的ICW和OCW命令發送到各自的I/O端口上的PIC來完成,這就是爲什麼我建議您參考一些文檔 – Jason
究竟什麼是你的操作系統是指的是'C/C++內核'?你是從頭開始寫的嗎? – bmargulies
你在說什麼操作系統? – hamstergene
沒有「C/C++」內核。內核是操作系統的一部分,而不是語言。真正的問題是你沒有指定操作系統(甚至架構),因此這個問題是無法回答的。 –