15

我正在为我正在开发的一个非常基本的内核处理键盘输入,但我完全被卡住了。我似乎无法在网上找到任何可以显示我需要知道的信息的信息。

我的内核现在在保护模式下运行,所以我不能使用实模式键盘例程而不跳转到实模式并返回,这是我试图避免的。我希望能够从保护模式访问我的键盘。有谁知道如何做到这一点?到目前为止,我发现的唯一一件事是它涉及直接使用输入/输出端口与控制器对话,但除此之外,我感到很困惑。当然,这不是经常出现的事情。通常,Assembly 教程假定您在下面运行操作系统。

我对 x86 程序集非常陌生,所以我只是在寻找一些很好的资源来使用受保护模式下的标准硬件。我正在使用 NASM 编译程序集源代码,并将其链接到使用 DJGPP 编译的 C 源代码。有什么建议么?

4

3 回答 3

15

MIT 操作系统类有很多很好的参考资料。特别是,请查看Adam Chapweske关于键盘和鼠标编程的资源。

简而言之,是的,您将使用原始输入/输出端口,这需要在内核模式下运行,或者在 EFLAGS 寄存器中设置 I/O 权限位 (IOPL)。有关 I/O 权限的更多详细信息,请参阅此页面

于 2008-10-20T16:59:22.383 回答
3

在真实模式和受保护模式下,您使用标准传统硬件的方式相同。在这种情况下,您想在 I/O 端口 0x60 到 0x6f 上与 8042 通信,而后者又会与线另一端的键盘内的控制器通信。

快速的 Google 搜索发现我在http://heim.ifi.uio.no/~stanisls/helppc/8042.html(适用于 8042)和http://heim.ifi.uio.no/~stanisls上找到了一个有趣的资源/helppc/keyboard_commands.html(用于键盘)。

如果您不习惯,您可以通过 IN(读取)和 OUT(写入)操作码与 I/O 端口上的组件通信,这些操作码接收 I/O 端口号(16 位值)和值可读取或写入(8、16 或 32 位)。请注意,读取或写入的大小很重要!将 16 位写入需要 8 位的东西(反之亦然)是灾难的根源。习惯这些操作码,因为您会经常使用它们(这是与某些外设通信的唯一方法,包括几个必不可少的外设;其他外设使用内存映射 I/O (MMIO) 或总线主控 DMA)。

于 2008-10-20T17:06:50.667 回答
1

8042 PS/2 控制器看起来是最简单的可能性。

The oszur11 OS tutorial contains a working example under https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

Just:

sudo apt-get install build-essential qemu
sudo ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
git clone git://git.code.sf.net/p/oszur11/code oszur11
cd oszur11/Chapter_06_Shell/04_Makepp
make qemu

Tested on Ubuntu 14.04 AMD64.

My GitHub mirror (upstream inactive): https://github.com/cirosantilli/oszur11-operating-system-examples

Not reproducing it here because the code it too long, will update if I manage to isolate the keyboard part in a minimal example.

于 2015-10-20T11:05:00.720 回答