我正在使用 Intel core 2 duo CPU 和 windows 7 OS。我听说每个设备都映射到内存中,如果是这样,我怎样才能获得连接到我的系统的键盘地址?我的意图是将键盘输入读入 volatile 变量。那可能吗 ?
5 回答
那将是您的键盘连接到的 USB 控制器的地址。但是,知道这不会让您直接访问键盘,因为:
它是一个 USB 控制器,而不是键盘本身。键盘将消息发送到 USB 控制器,然后由操作系统解释为“键盘事件”。
操作系统保护硬件地址,因此您只能通过适当的设备驱动程序访问它们。
在过去,它甚至不是内存,键盘进入了一个“键盘控制器”芯片,它出现在 I/O 端口 60 和 64(或最初的 IBM PC 和 XT PC 中的 60/61)。尽管如此,在现代操作系统中,如果没有设备驱动程序,您将无法“窥视”或“戳”键盘。
键盘是标准输入设备,scanf
可用于从键盘读取。
volatile
主要用于内核空间。如果你想看到这个关键字的作用,最简单的方法是为 Linux 编写一个简单的内核模块,它读取一些随机的 CPU 外围寄存器。
更新
尽管volatile
经常用于读取硬件寄存器,例如微控制器固件,但这并不是唯一的用例。在下面的一些评论之后,很明显其他一些现实世界的场景是可能的,例如内存映射文件。“内存”的内容可能会改变,而程序没有任何可见的写入。如果不使用volatile
,编译器可能会相应地优化读取,从而导致返回/处理错误的数据。
我不知道如何访问 MS Windows 中的受限内存区域。在 Linux 中,您可以使用ioperm
或iopl
获取 I/O 端口权限。
键盘映射在 0x60 状态寄存器和 0x64 输入缓冲存储器位置。您可以很好地了解如何直接从键盘读取和写入内容:http ://www.brokenthorn.com/Resources/OSDev19.html
此外,您可能想查看 Linux 键盘驱动程序源代码。
但是,如果您计划使用这些端口直接读取通过键盘键入的字符,就像您在getchar
or scanf
or 中所做的那样,那么这是不正确的。使用此端口,您需要编写自己的键盘驱动程序,以便解码来自这些端口的任何内容,然后将它们映射到按下的字符、注意或切换键等等。
我不知道 windows 7 操作系统,但我很确定它不会让你直接访问键盘设备,如果只是出于安全原因。