0

次のスニペット コードは、JOS の A20 を有効にします。私を混乱させる問題があります。「$0xdf」はコマンドであり、データではありません。コマンド ポートであるポート 0x64 に送信する必要があります。実際には、データ ポートである 0x60 にポートします。ここでは、2 つの方法 (方法 3.1 と方法 3.2) が存在します: http://www.brokenthorn.com/Resources/OSDev9.html

だから、私の質問は: なぜ最後に 0x60 (outb %al, %0x60) に移植するのですか?

seta20.1:
  inb     $0x64,%al               # Wait for not busy
  testb   $0x2,%al
  jnz     seta20.1

  movb    $0xd1,%al               # 0xd1 -> port 0x64
  outb    %al,$0x64                                                                                

seta20.2:
  inb     $0x64,%al               # Wait for not busy
  testb   $0x2,%al
  jnz     seta20.2

  movb    $0xdf,%al               # 0xdf -> port 0x60
  outb    %al,$0x60
4

2 に答える 2

1

コマンドを PS/2 コントローラに送信するには、コマンド バイトを IO ポート 0x64 に書き込むだけです。「次のバイト」がある場合、(ステータス レジスタのビット 1 がクリアされていることを確認して) コントローラーの準備が整っていることを確認した後、次のバイトを IO ポート 0x60 に書き込む必要があります。

したがって、0xd1 をポート 0x64 に送信した後、コマンド 0xdf がポート 0x60 に送信され、A20 が有効になります。

応答バイトがある場合、(ステータス レジスタのビット 0 が設定されていることを確認して) 応答バイトが到着したことを確認した後、応答バイトを IO ポート 0x60 から読み取る必要があります。

ソース: PS/2_Controller - osdev wiki

于 2015-11-28T20:50:30.093 に答える
1

標準的な手順のようです。私のコメントで述べたように、ポート 0x60 はキーボード関連です。しかし、それだけが機能ではありません。

キーボードコントローラーを介したクラシックな A20 コントロール

キーボードコントローラーの出力ポートには、いくつかの機能があります。ビット 0 は CPU のリセット (リアル モードへの移行) に使用されます - ビット 0 が 0 の場合にリセットが発生します。ビット 1 は A20 の制御に使用されます - ビット 1 が 1 の場合は有効になり、ビット 1 が 0 の場合は無効になります。最初に 0xd1 をポート 0x64 に書き込み、出力ポートの目的の値をポート 0x60 に書き込むことにより、キーボード コントローラの出力ポートを指定します。通常、A20 を無効/有効にするために使用される値 0xdd および 0xdf が表示されます。したがって:

call    empty_8042
mov     al,#0xd1                ! command write
out     #0x64,al
call    empty_8042
mov     al,#0xdf                ! A20 on
out     #0x60,al
call    empty_8042

出典: A20 - 過去からの痛み

于 2013-04-02T16:49:04.127 に答える