0

下面的代码片段是为 JOS 启用 A20。它有一个让我感到困惑的问题。“$0xdf”是一个命令,而不是数据。它应该输出到端口 0x64,这是命令端口。实际上,它的端口是0x60,也就是数据端口。在这里,存在两种方法(方法 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

这似乎是一个标准程序。正如我在评论中所说,端口 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 回答
1

要向 PS/2 控制器发送命令,只需将命令字节写入 IO 端口 0x64。如果有“下一个字节”,则需要在确保控制器已准备好之后将下一个字节写入 IO 端口 0x60(通过确保状态寄存器的第 1 位被清除)。

因此,在将 0xd1 发送到端口 0x64 后,命令 0xdf 将发送到端口 0x60,从而启用 A20。

如果有响应字节,则需要在确定响应字节已到达(通过确保设置状态寄存器的位 0)后从 IO 端口 0x60 读取响应字节。

来源:PS/2_Controller - osdev wiki

于 2015-11-28T20:50:30.093 回答