picirq.h
-
接收中斷信号int 0x20~0x2f
,因為IRQ0~15
不能用于IRQ。int 0x00~0x1f
picirq.c
-
即pic0_mask=0xfb
;PIC1以外全部禁止。1111 1011
即pic1_mask=0xff
;禁止所有中斷1111 1111
-
函數就是将pic_enable
即IRQ号屏蔽取消irq_num
- 當一個外部中斷請求通過中斷請求線
傳輸到IRQ
,IMR根據設定的中斷屏蔽字決定丢棄還是接受。IMR(中斷屏蔽寄存器)
- 主從PIC如下如所示,PIC是一個8259A晶片,上面有一些引腳,其中包括了ICW、OCW等引腳。
-
每一個8259A晶片都有兩個I/O ports,程式員可以通過它們對8259A進行程式設計。
Master 8259A的端口位址是0x20,0x21;Slave 8259A的端口位址是0xA0,0xA1。
- EOI:end of interrupt
kbd.h
- 鍵盤按鍵參考
https://wiki.osdev.org/PS/2_Keyboard#Scan_Code_Set_1
int_handlers.c
- 鍵盤控制器是8042(PS/2)晶片,它的作用是接收和解碼來自鍵盤的資料并放到緩沖區,然後通知8259A産生IRQ1。
- 讀緩沖區,讀0x60端口
- 寫緩沖區,寫0x60端口
- 讀狀态寄存器,讀0x64端口
- 控制寄存器,寫0x64端口
- 其中讀出的緩存資料0xe0和0xe1是特殊鍵值需要單獨處理
- 鍵盤擡起産生的數值=按下産生的數值+0x80
init.c
- CR3寄存器存儲的是頁目錄表頁面起始實體位址,因為頁目錄表都是4KB對齊,是以隻有高20位是有效的。低12位有其他用處。
- CR0寄存器最低位是PE保護模式标志位,最高位是PG分頁模式标志位。
- 啟動分頁機制需要三步:1、準備好頁目錄表和頁表;2、将頁表位址寫入CR3;3、将CR0的PG位制1。
- 另外啟動分段或者啟動分頁,也就是修改CR0的相關位置後,以後都是由硬體自動進行位址的轉換。
- 再記錄一下中斷的開發。先定義好函數聲明和函數實作,然後再GDT表初始化完成的基礎上用中斷函數指針去初始化IDT表,然後再做好IDTR,這樣就可以根據中斷号去找中斷函數了。然後需要注意的是什麼中斷對應什麼編号是由硬體本身決定的,比如
,然後重點是要設定IMR取消對此中斷的屏蔽,這樣當下次産生中斷時,硬體根據自身情況産生中斷号,經過IDTR找IDT,然後找到相應的中斷處理函數執行。這樣就完成了一次中斷處理。https://logix.cz/michal/doc/i386/chp09-08.htm#09-08