如何通过BIOS中断在实模式下处理键盘?

6
我需要编写一个操作系统,以便可以运行计算器,就像桌面计算器一样。为此,我正在阅读brokenthorn操作开发系列,我已经完成引导加载程序的第二个阶段,引导加载程序处于实模式。在此之后,作者将介绍保护模式,但我不想使用保护模式,因为我没有时间。所以我想通过使用BIOS中断在实模式下编写计算器。这是否可行?我认为它可以写在引导加载程序的第二阶段(我不确定)。这意味着我不必使用内核(我不确定)。我不知道如何使用BIOS中断来处理键盘。有人能提供一个链接帮助我吗?如果我上述任何假设有误,请纠正我。谢谢。

你会发现[PC Interrupts][1]是一个非常有价值的工具。你可以在以下链接中以不到4美元的价格获得它。 [1]: http://www.amazon.com/PC-Interrupts-Programmers-Reference-Third-Party/dp/0201624850 - Tergiver
3个回答

10

如果你想使用高级BIOS键盘服务,而不是自己处理键盘中断,那么INT 16h是你需要的。

INT 16hAH=00h10h将阻塞等待按键(在AL中返回ASCII码);如果你想避免阻塞,请使用AH=01h11h查询是否有按键可用(如果有按键可用,则立即返回,否则设置ZF标志)。参见例如这里,或这里(或使用Google搜索“INT 16h”以获得更多信息)。


请问,先生,如何在没有高级BIOS服务的情况下“自己处理键盘中断”?使用这种高级服务有什么缺点吗?性能会变差吗? - travisjayday

5

不是IRQ 9,而是IRQ 1:http://www.webopedia.com/quick_ref/IRQnumbers.asp。IRQ 9可用于通用其他设备(如PCI设备)。 IRQ1是键盘中断。 - Matt
@Matt,从我的回答中的链接可以看出:键盘控制器使用IRQ 1。x86中断控制器将其映射到中断9,因此从键盘控制器接收到IRQ具有执行int 9相同的效果。 - Frédéric Hamidi
1
如果PIC未被重新映射且您未使用IOAPIC,则与执行INTERRUPT 9相同(它与NPX_OVERRUN CPU异常重叠,而不是IRQ9处理程序)。虽然IRQ和中断之间的映射是可配置的,但IRQ9永远不等于IRQ1。实际上,从您自己的链接中可以看出:“键盘控制器使用IRQ 1”。由于所有操作系统都会重新映射PIC,以便IRQ不会重叠CPU异常,因此您的答案最好只说键盘使用IRQ1。 - Matt
@Matt,你说得对,IRQ 1确实映射到中断9而不是IRQ 9。我试图在我的答案中澄清这一点。感谢提醒 :) - Frédéric Hamidi

3

极简GAS引导扇区BIOS示例

当你输入一个字符时,它会被打印到屏幕上。

main.S

.code16
.global _start
_start:
cli

/* Set SS and SP as they may get used by BIOS calls. */
xor %ax, %ax
mov %ax, %ss
mov $0x0000, %sp

/* Get input to %al */
mov $0x00, %ah
int $0x16

/* Print the input from %al */
mov $0x0E, %ah
int $0x10

hlt

.org 510
.word 0xaa55

编译并运行:

as -o main.o main.S
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
qemu-system-i386 -hda main.img

GitHub上游

在Ubuntu 14.04 AMD64、Binutils 2.24、QEMU 2.0.0和真实硬件Lenovo Thinkpad T400上进行测试。


你的代码存在潜在问题,即你假设你有有效的栈段(SS)和栈指针(SP)。BIOS中断需要栈空间,因此最好在发出BIOS调用之前设置有效的SSSP。你无法真正依靠BIOS从引导扇区加载代码时的段寄存器状态。模拟和虚拟机环境通常会友好地保留有效状态,但在一些真实硬件上并非总是这样。 - Michael Petch
@MichaelPetch 谢谢你的信息!我会研究一下。对于 SP,任何高于 0x7C00 的内存都可以,还是有更好、更具体的值?SS 应该设置为 0。 - Ciro Santilli OurBigBook.com
任何可用的东西都可以,但我通常避免使用小于0x0000:0x1000及以下的内容。你可以将堆栈段放在0x0000:0x7C00以下(通常是我过去所做的)。 - Michael Petch
1
@MichaelPetch 好的!在这里找到了那个问题:https://dev59.com/xWPVa4cB1Zd3GeqP9dr8 - Ciro Santilli OurBigBook.com

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接