2008-10-20 44 views
13

我正在开发我正在开发的一个非常基本的内核的键盘输入,并且我完全卡住了。我似乎无法在网上找到任何可以显示我需要知道的信息的信息。x86组件上的受保护模式键盘访问

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

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

+0

嗨,我知道这是一个老问题,但你可以编辑你的问题的解决方案,或看看我的问题http://stackoverflow.com/questions/22744624/keyboard-interrupt-handler-for- own-kernel-c?谢谢 – 2014-03-30 14:26:35

回答

12

MIT operating systems class有很多很好的参考。特别是在键盘和鼠标编程上检查出Adam Chapweske's resources

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

+1

耶!由于这些页面,我得到了它的工作。你太棒了,如果可以的话,我会投你10次。现在我只需要将扫描代码转换为ASCII码,但我可以这么做,(另外,将扫描码输出到屏幕上看起来非常整齐!)谢谢! – 2008-10-20 18:51:21

+1

非常有用! – 2011-09-27 20:21:49

3

您可以在真实和受保护的模式下以相同的方式使用标准传统硬件。在这种情况下,您需要在I/O端口0x60至0x6f处与8042进行通信,而这些端口又将与线路另一端的键盘内的控制器进行通信。

快速谷歌搜索发现我在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)。

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

不在这里重现它,因为它的代码过长,会如果我设法在一个小例子,键盘部分隔离更新。