【发布时间】: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