Keyboard x86程序集上的受保护模式键盘访问

Keyboard x86程序集上的受保护模式键盘访问,keyboard,x86,kernel,osdev,protected-mode,Keyboard,X86,Kernel,Osdev,Protected Mode,我正在为我正在开发的一个非常基本的内核进行键盘输入,我完全被卡住了。我似乎在网上找不到任何可以告诉我需要知道的信息 我的内核现在正在保护模式下运行,所以我不能在不跳转到实模式并返回的情况下使用实模式键盘例程,这是我试图避免的。我希望能够从保护模式访问我的键盘。有人知道怎么做吗?到目前为止,我发现的唯一一件事是,它涉及到直接使用输入/输出端口与控制器对话,但除此之外,我感到困惑。当然,这并不是经常发生的事情。通常情况下,汇编教程假定您正在下面运行操作系统 我是x86程序集的新手,所以我正在寻找一些

我正在为我正在开发的一个非常基本的内核进行键盘输入,我完全被卡住了。我似乎在网上找不到任何可以告诉我需要知道的信息

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

我是x86程序集的新手,所以我正在寻找一些好的资源,用于从保护模式使用标准硬件。我正在用NASM编译汇编源代码,并将其链接到用DJGPP编译的C源代码。有什么建议吗?

这本书有很多很好的参考资料。特别是,查看键盘和鼠标编程


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

在真实模式和受保护模式下,您可以以相同的方式使用标准旧硬件。在这种情况下,您希望在I/O端口0x60到0x6f与8042进行通信,而这反过来又将与导线另一端键盘内的控制器进行通信

快速的谷歌搜索发现我在(8042)和(键盘)上找到了一个有趣的资源


如果不习惯,您可以通过输入(读取)和输出(写入)操作码与I/O端口上的组件进行对话,这些操作码接收I/O端口号(16位值)和要读取或写入的值(8、16或32位)。请注意,读取或写入的大小非常重要!将16位写入预期为8位的内容(反之亦然)会导致灾难。习惯这些操作码,因为您将经常使用它们(这是与某些外围设备通话的唯一方式,包括一些基本的外围设备;其他外围设备使用内存映射I/O(MMIO)或总线主控DMA)。

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

oszur11操作系统教程包含以下示例:

只是:

在Ubuntu 14.04 AMD64上测试

My GitHub镜像(上游非活动):


不要在这里复制它,因为代码太长,如果我在一个简单的例子中设法隔离键盘部分,它将更新。

Yay!!!多亏了那些网页,我才得以工作。你太棒了,如果可以的话,我会投你10票。现在我只需要将扫描代码转换为ASCII码,但我可能可以做到(而且,让它将扫描代码输出到屏幕上看起来非常整洁!)多谢!麻省理工学院链接失效,可能更新为:这是一个很好的信息,但是,我发现我需要与端口0x60和ox64通信,而不是0x6F。所有的文档似乎都指向这个方向。可能是输入错误?端口是0x60到0x6f(请查看任何x86 Linux机器上的/proc/ioport)。其中,0x60和0x64被实际使用。链接已失效,但wayback机器有它们:嗨,我知道这是一个老问题,但你能用解决方案编辑你的问题,或者看看我的问题吗?非常感谢。
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