【问题标题】:BIOS reads twice from different port to the same register in a rowBIOS 从不同端口连续读取两次到同一寄存器
【发布时间】:2017-07-24 10:53:09
【问题描述】:

我是组装新手。在试图弄清楚 BIOS 的作用时,我使用 gdb 来跟踪它。但是,我发现了一些对我来说非常奇怪的东西。
代码段是这样的:

[f000:d129]    0xfd129: mov    eax,0x8f
[f000:d12f]    0xfd12f: out    0x70,al
[f000:d131]    0xfd131: in     al,0x71
[f000:d133]    0xfd133: in     al,0x92
[f000:d135]    0xfd135: or     al,0x2
[f000:d137]    0xfd137: out    0x92,al

我想知道为什么 BIOS 连续从端口 0x71 和 0x92 读取。第二条指令会覆盖从端口 0x71 读取的值吗?那为什么从 0x71 端口读取呢?

谢谢!

【问题讨论】:

    标签: assembly operating-system bios


    【解决方案1】:

    IO口0x70为“CMOS/RTC索引寄存器”,IO口0x71为“CMOS/RTC数据寄存器”。要访问 CMOS 中的某些内容,您应该设置索引,然后读取/写入数据寄存器。

    对于某些 RTC 芯片,如果您设置了索引并且不读取或写入数据寄存器,则芯片将处于未定义状态。这意味着如果您想为以后设置索引,您必须从数据寄存器中读取,以避免现在和以后之间的“未定义状态”。

    换句话说;读取的值不相关 - 读取会产生副作用,而重要的是副作用。

    【讨论】:

    • 端口 0x70 也用于禁用/启用 NMI,如果位 7 为 0,则启用 NMI,如果位 7 为 1,则禁用 NMI。因此,由于您给出的原因,代码正在禁用 NMI,然后对端口 0x71 进行虚拟读取。
    • @RossRidge:我花了好几年才终于忘记了可怕的“忽略灾难性的硬件故障并继续勇敢地前进而不知道”的可能性。我现在好悲伤。 ;-)
    • 哦,是的 - 屏蔽不可屏蔽中断的想法是邪恶的。我们真的不应该再提起这个。叹息……
    【解决方案2】:

    端口0x700x71CMOS registers

    我找到的关于这个主题的最佳列表is from the BOCHS emulator
    根据这个列表,代码如下:

    mov    eax,0x8f   ; sets 'NMI disabled ' and 'CMOS RAM index' = 64
    out    0x70,al    ; write
    in     al,0x71    ; any write to 0x70 should be followed by an action to 0x71 or the RTC wil be left in an unknown state.
    in     al,0x92    ; read PS/2 system control port A
    or     al,0x2     ; set BIT1 = indicates A20 active
    out    0x92,al    ; write PS/2 system control port A
    

    因此,此代码禁用 NMI 并将 A20 line 设置为 活动 状态。最后三行实现Fast A20 Gate


    我想知道为什么 BIOS 连续从端口 0x71 和 0x92 读取

    原因很简单

    any write to 0070 should be followed by an action to 0071 or the RTC will be left in an unknown state.
    

    所以第一次读取(读取到in al,0x71)除了确保这一点之外没有其他目的,因此可以忽略它的结果。

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 2022-01-23
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多