9

カーネルをセットアップするために、いくつかのチュートリアルとリファレンスに従っています。チュートリアルで、まったく説明していないなじみのないコードに出くわしました。16 IRQs (0-15)ISRの場所にマップすると言われているのはコードです32-47

void irq_remap(void)
{
    outportb(0x20, 0x11);
    outportb(0xA0, 0x11);
    outportb(0x21, 0x20);
    outportb(0xA1, 0x28);
    outportb(0x21, 0x04);
    outportb(0xA1, 0x02);
    outportb(0x21, 0x01);
    outportb(0xA1, 0x01);
    outportb(0x21, 0x0);
    outportb(0xA1, 0x0);
}

のコードoutportb()は次のとおりですが、私はすでにそれが何をしているのかを明確に把握しています:

void outPortB(unsigned short port, unsigned char data)
{
    __asm__ __volatile__ ("outb %1, %0" : : "dN" (port), "a" (data));
}

これは保護モードの x86 アーキテクチャ上にあることに注意してください。このソース コードは正常に動作し、その機能は理解できますが、どのように機能するかはわかりません。誰かがここで何が起こっているのか説明してもらえますか?

4

2 に答える 2

15

outb同様に、ハードウェア IO ポートに書き込みます。基本的に、デバイスとの通信には 2 つの主要なオプションがあります。デバイスをメモリまたは IO ポートにマップできます。

このコードがどのように機能するかについては、コメントします。

ICW は「​​初期化コマンド ワード」の略です。

outportb(0x20, 0x11); /* write ICW1 to PICM, we are gonna write commands to PICM */
outportb(0xA0, 0x11); /* write ICW1 to PICS, we are gonna write commands to PICS */

outportb(0x21, 0x20); /* remap PICM to 0x20 (32 decimal) */
outportb(0xA1, 0x28); /* remap PICS to 0x28 (40 decimal) */

outportb(0x21, 0x04); /* IRQ2 -> connection to slave */ 
outportb(0xA1, 0x02);

outportb(0x21, 0x01); /* write ICW4 to PICM, we are gonna write commands to PICM */
outportb(0xA1, 0x01); /* write ICW4 to PICS, we are gonna write commands to PICS */

outportb(0x21, 0x0); /* enable all IRQs on PICM */
outportb(0xA1, 0x0); /* enable all IRQs on PICS */

お役に立てれば

OS dev の世界へようこそ :) また、http: //forum.osdev.org/にアクセスすることをお勧めします。これは、新しい趣味の OS 開発者にとって非常に貴重なリソースです。

于 2008-11-12T04:24:06.537 に答える
1

簡単な答えは、プロテクトモードでは、1番目のプログラマブル割り込みコントローラーによって使用される割り込みはプロテクトモードの例外であるということです。つまり、それらを再マッピングする必要があります。

嬉しい答えは、最初のものだけPICを再マッピングする必要があるということです(2番目の再マッピングはで始まるので便宜上ですint 70h)。これは、元のATBIOSからの引用です。

INTA00    equ  020h        ; 8259 port
INTA01    equ  021h        ; 8259 port
INTB00    equ  0A0h        ; 2nd 8259
INTB01    equ  0A1h
INT_TYPE  equ  070h        ; start of 8259 interrupt table location

;---------------------------------------------------------
;    re-initialize the 8259 interrupt #1 controller chip :
;---------------------------------------------------------
  mov  al, 11h             ; icw1 - edge, master, icw4
  out  INTA00,al
  jmp  $+2                 ; wait state for i/o
  mov  al, 8               ; setup icw2 - int type 8 (8-f)
  out  INTA01, al
  jmp  $+2
  mov  al, 4               ; setup icw3 - master lv 2
  out  INTA01, al
  jmp  $+2
  mov  al, 1               ; setup icw4 - master, 8086 mode
  out  INTA01, al
  jmp  $+2
  mov  al, 0FFh            ; mask all ints. off
  out  INTA01, al          ; (video routine enables interrupts)
;---------------------------------------------------------
;    re-initialize the 8259 interrupt #2 controller chip  :
;---------------------------------------------------------
  mov  al, 11h             ; icw1 - edge, slave icw4
  out  INTB00, al
  jmp  $+2
  mov  al, INT_TYPE        ; setup icw2 - int type 70 (70-7f)
  out  INTB01, al
  mov  al, 2               ; setup icw3 - slave lv 2
  jmp  $+2
  out  INTB01, al
  jmp  $+2
  mov  al, 1               ; setup icw4 - 8086 mode, slave
  out  INTB01, al
  jmp  $+2
  mov  al, 0FFh            ; mask all ints. off
  out  INTB01, al
;--------------------------------------------------------------------------------

テクニカルリファレンスATBIOS(c)1984 IBM

ノート:

現在のjmp $+2 ; wait state for i/oPCでは必要ありません。

icw1、割り込みマスクレジスタをクリアします。これにより、そのPICでの割り込みが有効になります。

8259Aチップは古くからありますが、プログラミングインターフェイスはまだ使用されています。 8259Aプログラマブル割り込みコントローラー

于 2010-08-30T21:38:03.080 に答える