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

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

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

有帮助吗?

解决方案

麻省理工学院操作系统课程有很多很好的参考资料。特别是,请查看有关键盘和鼠标编程的 Adam Chapweske的资源

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

其他提示

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

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)。

8042 PS / 2控制器看起来最简单。

oszur11操作系统教程包含 https://sourceforge.net/p/oszur11/code/ci/master/tree/Chapter_06_Shell/04_Makepp/arch/i386/arch/devices/i8042.c

只需:

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

在Ubuntu 14.04 AMD64上测试。

我的GitHub镜像(上游不活动): https://github.com/cirosantilli/ oszur11-操作系统-例子

这里不再复制,因为代码太长了,如果我设法在最小的例子中隔离键盘部分,它将会更新。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top