启用 A20 门时需要这么多键盘控制器等待调用吗

Posted

技术标签:

【中文标题】启用 A20 门时需要这么多键盘控制器等待调用吗【英文标题】:Are so many keyboard controller wait calls needed when enabling the A20 gate 【发布时间】:2014-02-17 09:29:35 【问题描述】:

从 A20 行的OSDev page 中,启用 A20 的代码如下:

enable_A20:
    cli

    call    a20wait
    mov     al,0xAD
    out     0x64,al

    call    a20wait
    mov     al,0xD0
    out     0x64,al

    call    a20wait2
    in      al,0x60
    push    eax

    call    a20wait
    mov     al,0xD1
    out     0x64,al

    call    a20wait
    pop     eax
    or      al,2
    out     0x60,al

    call    a20wait
    mov     al,0xAE
    out     0x64,al

    call    a20wait
    sti
    ret

a20wait:
    in      al,0x64
    test    al,2
    jnz     a20wait
    ret


a20wait2:
    in      al,0x64
    test    al,1
    jz      a20wait2
    ret

a20wait 等待输入缓冲区,a20wait2 等待输出缓冲区。

据我了解,写入/读取 0x64 访问的是命令/状态寄存器,而不是缓冲寄存器。

那为什么输入/输出缓冲区有这么多等待?在读取状态寄存器之前输出缓冲区不应该有一个,写入新命令字节后输入缓冲区不应该有一个吗?

我尝试禁用除了我在上一段中提到的两个之外的所有其他等待调用,它工作正常。但我很好奇他们为什么在那里。还有其他原因吗?

【问题讨论】:

a20wait 函数测试输入缓冲区状态位是否清除,这在将任何值写入端口 0x60 或 0x64 之前是必需的。有关详细信息,请参阅wiki.osdev.org/%228042%22_PS/2_Controller#Status_Register。 另外,我注意到你在这里问了很多关于操作系统开发的问题。我建议在forum.osdev.org/index.php 注册一个帐户,因为您阅读的几乎所有教程都是由该社区的人编写的。如果您在那里问,您可能会在更短的时间内得到更详细的答案。 【参考方案1】:

A20 门控信号由另一个处理器提供。传统上是 8042 微控制器,其输出端口引脚之一驱动信号。该微控制器旨在处理键盘接口,它有一个未使用的输出引脚,因此设计 AT 的 IBM 工程师决定降低硬件成本并用它控制 A20 门信号。

主处理器和微控制器之间的接口非常简单,只有两个 8 位端口。 I/O地址0x60是数据端口,0x64是命令/状态端口。

8042 执行自己的程序,完全独立于主处理器。所以需要小心与它交谈,握手必须在软件中完成。只有确定8042获取到前面的命令并执行之后,才能写东西。并且只有在确保 8042 写入数据端口后才能读取内容。因此,需要旋转输入和输出缓冲区状态位才能让 8042 赶上。

删除旋转可能在模拟器中起作用。不太可能在真实硬件上正常工作,你可能会很幸运。冒险是完全没有意义的。

【讨论】:

但是在0x64写入/读取的情况下,不涉及输入输出缓冲区,为什么还要等待呢?我同意数据传输需要等待。

以上是关于启用 A20 门时需要这么多键盘控制器等待调用吗的主要内容,如果未能解决你的问题,请参考以下文章

为啥启用/禁用 A20 线

在纯 UEFI 中启动时谁启用了 A20 线?

为啥启用 Cloud Run API 会创建这么多服务帐号?为啥他们有这么多特权?

多线程编程基础

GWT - Datagrid:键盘单选,启用多选时

我对A20线检查代码的理解是否正确?