我正在为我正在开发的非常基本的内核进行键盘输入,而且我完全卡住了。我似乎无法在网上找到任何可以向我显示我需要知道的信息。
我的内核现在正在受保护模式下运行,所以我不能使用实模式键盘例程而不会跳转到实模式和后退,这是我试图避免的。我希望能够从保护模式访问我的键盘。有谁知道如何做到这一点?到目前为止我唯一发现的是它涉及使用输入/输出端口直接与控制器通信,但除此之外我感到难过。当然,这不是经常出现的事情。通常,Assembly教程假设您正在运行下面的操作系统。
我对x86程序集非常陌生,所以我只是在寻找一些好的资源来处理来自保护模式的标准硬件。我正在用NASM编译汇编源代码并将其链接到用DJGPP编译的C源代码。有什么建议吗?
答案 0 :(得分:12)
MIT operating systems class有很多很好的参考资料。特别是,请查看键盘和鼠标编程的Adam Chapweske's resources。
简而言之,是的,您将使用原始输入/输出端口,这需要在内核模式下运行,或者在EFLAGS寄存器中设置I / O权限位(IOPL)。有关I / O权限的详细信息,请参阅this page。
答案 1 :(得分:3)
您可以在实际和受保护模式下以相同方式使用标准传统硬件。在这种情况下,您希望在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)。
答案 2 :(得分:0)
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-operating-system-examples
这里没有复制它,因为代码太长了,如果我设法在最小的例子中隔离键盘部分,它将会更新。