我正在使用英特尔酷睿2双核CPU和Windows 7操作系统。我听说每个设备都映射到内存中,如果是这样,我如何获得连接到我系统的键盘地址?我的目的是将键盘输入读入一个volatile变量。这可能吗?
答案 0 :(得分:8)
这将是键盘连接到的USB控制器的地址。但是,知道这不会让您直接访问键盘,因为:
这是一个USB控制器,而不是键盘本身。键盘将信息发送到USB控制器,然后由操作系统将其解释为“键盘事件”。
操作系统保护硬件地址,使您只能通过适当的设备驱动程序访问它们。
在过去,它曾经甚至不是内存,键盘转到了一个“键盘控制器”芯片,它出现在I / O端口60和64(或者是非常原始的IBM PC和XT中的60/61) PC)。尽管如此,在现代操作系统中,如果没有设备驱动程序,您无法“偷看”或“捅”键盘。
答案 1 :(得分:1)
键盘是标准输入设备,scanf
可用于从键盘读取。
答案 2 :(得分:1)
volatile
主要用于内核空间。如果你想看到这个关键字在运行,最简单的方法是为Linux编写一个简单的内核模块,它读取一些随机的CPU外设寄存器。
<强>更新强>
即使volatile
经常用于读取硬件寄存器,例如微控制器固件,它也不是唯一的用例。在下面的一些评论之后,很明显其他一些真实场景是可能的,例如内存映射文件。 “内存”的内容可能会更改,而程序不会显示任何写入内容。在不使用volatile
的情况下,编译器可以相应地优化读取,从而导致返回/处理错误的数据。
答案 3 :(得分:1)
我无法讲述如何访问MS Windows中受限制的内存区域。在Linux中,您可以使用ioperm
或iopl
来获取I / O端口权限。
键盘映射在状态寄存器0x60和输入缓冲存储器位置0x64。您可以直接从键盘上了解如何读取和写入内容:http://www.brokenthorn.com/Resources/OSDev19.html
另外,您可能需要查看Linux键盘驱动程序源代码。
但是,如果您计划使用这些端口直接读取键盘上键入的字符,就像在getchar
或scanf
中那样,那么这是不正确的。使用此端口,您需要编写自己的键盘驱动程序,以便解码通过这些端口传输的任何内容,然后将它们映射到按下的字符,小心或切换键等等。
答案 4 :(得分:0)
我不知道Windows 7操作系统,但我很确定它不会让你直接访问键盘设备,只是出于安全考虑。