了解操作系统如何存储/检索 IO 设备输入

2023-12-24

我对键盘等 I/O 设备如何存储输入以供操作系统或应用程序使用感到有点困惑。如果我有一台单处理器(单核CPU)的计算机,并且当前正在执行的进程是一个游戏,那么游戏如何能够“感知”键盘输入?即使按下按键会强制硬件中断(从而实现上下文切换),然后每当操作系统将控制权交还给游戏进程时,将键值“馈送到”游戏,也不能保证游戏循环会正常进行。检查当时玩家的输入,它也可以更新游戏对象位置或渲染游戏世界。

所以我的问题是……

  1. 像键盘这样的 I/O 设备是否将输入存储到某种板载硬件特定微处理器或板载内存存储缓冲区队列,这些输入稍后可以由外部进程或操作系统本身“读取”和刷新?非常感谢任何见解,谢谢!

像键盘这样的 I/O 设备是否将输入存储到某种板载硬件特定微处理器或板载内存存储缓冲区队列,这些输入稍后可以由外部进程或操作系统本身“读取”和刷新?

让我们把它分成3部分..

设备特定部分

适用于旧键盘(USB 之前);键盘中的微控制器定期扫描开关网格并检测何时按下或释放按键,将其转换为代码(可能是多个字节),然后一次将代码按字节发送到计算机。计算机还有一个小微控制器来接收这些字节。该微控制器有一个 1 字节缓冲区(对于多字节代码来说甚至不够大)。

对于较新的键盘 (USB);键盘的内部结构基本相同(微控制器扫描开关网格等);但 USB 控制器询问键盘“发生什么事了吗?”定期(通常每 8 毫秒)键盘的微控制器会做出响应。

任何状况之下;键盘驱动程序获取来自键盘的代码并对其进行处理;通常将其转换为固定长度的“密钥代码”,将其与其他数据合并(如果当时处于活动状态;如果存在对密钥有意义的 unicode 代码点等)并捆绑所有数据将其转化为数据结构。

操作系统特定部分

该数据结构(由键盘驱动程序创建)通常由操作系统标准化为“用户输入事件”(因此,键盘、鼠标、触摸屏、操纵杆等的“事件”数据结构相同)。

该“用户输入事件”是从驱动程序发送的。某种形式的进程间通信(管道、消息……)到其他东西(例如 GUI)。这种进程间通信有 2 个常见行为 - 如果接收程序因等待接收事件而被阻塞,则调度程序会解除阻塞(取消等待)并调度它再次获取 CPU 时间;如果接收程序没有等待,该事件通常会被放入待处理事件的队列(在内存中)中。

当然,通常涉及许多进程,并且“用户输入事件”可能会从一个进程(例如输入法编辑器)转发到另一个进程(例如 GUI)到另一个进程(例如具有键盘焦点的窗口)。此外(对于旧的遗留命令行内容)它可能最终会到达将事件转换为字符流的翻译层(例如终端仿真器)(stdin),同时销毁大部分信息(例如,当释放密钥时)。

语言特定部分

要从高级代码获取事件,这取决于语言是什么,有时还取决于所使用的库。最常见的是某种“getEvent()”,它使程序从其队列(从内存)中获取下一个事件;如果还没有任何事件获取,可能会导致程序等待(并且不使用任何 CPU 时间)。然而,通常这会被进一步隐藏,这样你注册了一个回调,然后当其他东西调用“getEvent()”时,当它收到一个事件时,它会调用你注册的回调;所以它最终可能会像(例如对于Java)public boolean handleEvent(Event evt) { switch (evt.id) { case Event.KEY_PRESS: ....

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解操作系统如何存储/检索 IO 设备输入 的相关文章

随机推荐