【问题标题】:How does rebooting a computer with a keyboard driver work?使用键盘驱动程序重新启动计算机如何工作?
【发布时间】:2019-11-23 15:20:16
【问题描述】:

我只是从本教程中学习内核编程,它是波兰语 - https://pl.wikibooks.org/wiki/Pisanie_OS 它在那里说键盘驱动程序有很多用途,包括重新启动计算机。这是一个代码:

reset: 
     call kbd 
     mov al,0xfe 
     out 0x64,al 

kbd0:   
     jmp short $+2 
     in al,60h 
kbd:    jmp short $+2 
     in al,64h 
     test al,1 
     jnz kbd0 
     test al,2 
     jnz kbd 
     ret

我不明白这段代码。谁能给我解释一下?

【问题讨论】:

  • 实际向键盘控制器发送复位命令的代码是mov al,0xfeout 0x64,al向键盘控制器写入命令0xfe的2条指令。 0xfe 是复位命令。首先调用的其余代码有效地确保了包含键盘已发送到 PC 的数据的键盘控制器缓冲区是空的。如果不是,则读取存在的数据,然后再次进行相同的检查,直到缓冲区为空。
  • 然后它检查发送缓冲区是否已满(在发送命令之前,请确保发送缓冲区为空)。如果是,则重新完成整个过程。一旦它发现发送缓冲区和接收缓冲区都是空的,那么函数kbd会在此时返回重置命令。
  • 至于jmp short $+2 与跳转到JMP后的指令相同。它只会在访问端口之前产生一小段延迟。我认为即使在旧硬件上也不需要它们。
  • 我个人认为代码正在做它不需要做的事情。向键盘控制器发送命令(如 0xfe 重置系统)时,只需要确保发送缓冲区(从 8042 芯片的角度来看的输入缓冲区)在发送命令之前为空。

标签: assembly x86 keyboard kernel driver


【解决方案1】:

8086 处理器有一个复位引脚。置位后,这会将处理器重置为其初始状态。该引脚连接到键盘控制器;如果您要求键盘控制器将复位引脚向上拉然后再向下拉(这是您发布的代码所做的),处理器将被重置。

现代 x86 处理器的工作方式与此有所不同,键盘控制器不再是单独的芯片。但是,同样的方法仍然会导致南桥产生一个复位信号,重新启动计算机。

【讨论】:

  • @RomanKwaśniewski:不是,但是当 IBM PC/AT 硬件问世时,并不是所有的信息(我们现在知道的)。硬件制造商 (IBM) 通过键盘控制器方法设计了重置。直到后来 OS/2 1.x 出现时,有人才发现如果你能产生一个三重故障,你就会得到保证的 CPU 复位。键盘方法较慢,有人正在寻找更快的方法。我相信 286 的 OS/2 最终使整个中断描述符表无效,然后导致异常。这会导致三重故障。
  • @RomanKwaśniewski :用于重置的键盘重置方法适用于所有模式(实模式和 16 位保护模式),因此从实模式重置也很有用。三重故障只能在保护模式下发生。这是在高级电源管理 (APM) 服务出现之前,您可以通过这种方式进行重置。
  • @MichaelPetch 8086 没有三重故障的概念。在 80286 上,三重故障机制记录在指令集参考中。
  • @fuz,AT 之前的 IBM-PC/XT 变体在端口 0x60(数据)和 0x61(控制)上使用 8255(PPI)作为键盘。没有用于重置的位,您也无法向键盘控制器发送重置命令。随着 IBM-PC/AT(80286) 的出现,他们开始使用 8042 控制器。然后他们添加了一个键盘控制器可以理解的 0xfe 命令。他们还通过控制器将 A20 线路分流。可以通过 8255 向键盘控制器发送命令的端口 0x64 在 IBM-PC 上不存在。
  • 8255 的复位输入引脚与系统的复位线相连,因此当确实发生复位时,8255 上的所有端口都返回到默认输入状态。
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多