启用A20门时,需要进行如此多的键盘控制器等待呼叫

时间:2014-02-17 09:29:36

标签: keyboard operating-system x86 polling osdev

从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访问命令/状态寄存器而不是缓冲寄存器。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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