天天看點

自己動手寫作業系統系列第3篇,實作時鐘和鍵盤中斷

picirq.h

  • ​int 0x20~0x2f​

    ​​接收中斷信号​

    ​IRQ0~15​

    ​​,因為​

    ​int 0x00~0x1f​

    ​不能用于IRQ。

picirq.c

  • ​pic0_mask=0xfb​

    ​​即​

    ​1111 1011​

    ​;PIC1以外全部禁止。​

    ​pic1_mask=0xff​

    ​即​

    ​1111 1111​

    ​;禁止所有中斷
  • ​pic_enable​

    ​​函數就是将​

    ​irq_num​

    ​即IRQ号屏蔽取消
  • 當一個外部中斷請求通過中斷請求線​

    ​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,這樣就可以根據中斷号去找中斷函數了。然後需要注意的是什麼中斷對應什麼編号是由硬體本身決定的,比如​

    ​https://logix.cz/michal/doc/i386/chp09-08.htm#09-08​

    ​,然後重點是要設定IMR取消對此中斷的屏蔽,這樣當下次産生中斷時,硬體根據自身情況産生中斷号,經過IDTR找IDT,然後找到相應的中斷處理函數執行。這樣就完成了一次中斷處理。

繼續閱讀