当前位置: 首页 > news >正文

解密键盘输入:探索设备控制器的奥秘

流程初探

键盘是我们最常用的输入硬件设备之一。作为程序员,你知道当我们敲击键盘上的字母"A"时,操作系统会发生什么吗?下面我将简要介绍整个过程,以便你更容易理解为什么需要这些组件。

首先,让我们来看看CPU的硬件架构图。

image

CPU内部的内存接口需要通过系统总线和I/O桥接器与内存建立连接。而桥接器另一侧连接着通过内存总线与CPU建立连接的内存。其他外接设备,如键盘和显示器,都是通过I/O总线连接的I/O设备。

当我们敲击键盘上的字母"A"时,整个过程可以简要概括为以下几个步骤:

  1. 键盘设备控制器扫描码存储:键盘设备控制器将扫描码数据存储在数据寄存器中。
  2. 中断请求发送给CPU:键盘设备控制器向CPU发送中断请求。
  3. CPU保存上下文并调用中断处理程序:CPU接收到中断请求后,保存当前进程的上下文,并调用键盘的中断处理程序。
  4. 扫描码转换为ASCII码并存储在键盘缓冲区:中断处理程序将扫描码转换为对应的ASCII码,并将其存储在键盘缓冲区中。
  5. 键盘驱动程序读取缓冲区的扫描码:键盘驱动程序负责读取键盘缓冲区中的扫描码。
  6. 数据传递给应用程序:键盘驱动程序根据需要将数据传递给相应的应用程序。
  7. 显示驱动程序控制显示器显示:显示驱动程序负责数据一个一个写入到显示设备的控制器的寄存器中的数据缓冲区并控制显示器的显示和屏幕图像的更新。

通过以上流程,我们可以实现键盘输入的响应和字符的显示。这是一个简单的键盘输入过程,实际上还需要考虑更多的细节和处理逻辑,但以上流程可以帮助我们初步理解键盘输入的处理过程。

设备控制器

我们的电脑设备可以连接各种不同的输入输出设备,如键盘、鼠标、显示器、网卡、硬盘、打印机和音响等。每个设备都有不同的使用方式和功能,但操作系统需要统一管理这些设备。

为了减轻CPU的负担,每个外设都配备了一个专门的设备控制器,其实也跟应用程序就不需要直接与底层设备进行交互一样。设备控制器位于操作系统与硬件之间的中间层,负责处理外设硬件与CPU之间的通信和操作。

为了屏蔽设备之间的差异,每个设备都配备了对应的设备控制器(Device Control)组件。例如,硬盘有硬盘控制器,显示器有视频控制器等。这些设备控制器通过与操作系统进行交互,将外设的功能和状态信息传递给操作系统,并接收来自操作系统的指令来控制设备的运行。

image

操作系统利用设备控制器提供的接口和功能来管理和控制不同的设备。通过操作系统提供的设备驱动程序,应用程序可以通过操作系统进行与设备的交互。设备驱动程序负责与设备控制器通信,并将数据传递给相应的设备。例如,键盘驱动程序负责读取键盘设备控制器中的扫描码,并将其转换为对应的ASCII码,然后传递给应用程序。

设备控制器内部包含芯片,这些芯片具有自己的逻辑功能,并且拥有与CPU进行通信的寄存器。这些寄存器包括状态寄存器(Status Register)、命令寄存器(Command Register)以及数据寄存器(Data Register)。

通过操作系统向这些寄存器写入命令,可以指示设备执行发送数据、接收数据、开启或关闭等操作。通过读取这些寄存器,操作系统可以获取设备的状态信息,例如设备是否准备好接收新的命令等,如下图:

image

具体而言,命令寄存器用于向设备发送命令,告知设备进行输入/输出操作。当命令被接收后,设备开始执行对应的任务,并在任务完成后将状态寄存器中的状态标记为完成。

状态寄存器的作用是向CPU传递设备的工作状态,以告知CPU设备当前是否正在工作或已经完成工作。如果设备处于工作状态,CPU再次发送数据或命令是没有意义的,直到前面的工作完成,状态寄存器将状态标记为已完成,CPU才能发送下一个字符或命令。

数据寄存器用于CPU向I/O设备写入需要传输的数据。例如,如果要打印内容为"Hello",CPU首先向对应的I/O设备发送一个’H’字符。

通过读写设备控制器中的寄存器,CPU能够方便地控制设备。相比于CPU直接控制输入输出设备,这种方式更加便捷和标准化。

另外,设备控制器还可以根据设备的特性将输入输出设备分为两大类:块设备(Block Device)和字符设备(Character Device)。

块设备将数据存储在固定大小的块中,每个块都有自己的地址。常见的块设备有硬盘、USB等。而字符设备则以字符为单位发送或接收字符流,它们是不可寻址的,也没有寻道操作。鼠标就是一个典型的字符设备。

由于块设备通常传输的数据量较大,因此设备控制器设立了一个可读写的数据缓冲区。当CPU向控制器的缓冲区写入数据时,只有当缓冲区中的数据达到一定程度时,才会发送给设备。而当CPU从控制器的缓冲区读取数据时,也需要等待缓冲区中的数据达到一定程度后,才能将数据拷贝到内存中。这样做的目的是为了减少对设备的操作次数,提高数据传输的效率。

那么,CPU是如何与设备的控制寄存器和数据缓冲区进行通信的呢?这里存在两种方法:

一种是通过端口 I/O方式,每个设备的控制寄存器都被分配了一个独立的I/O端口。CPU可以通过特殊的汇编指令(如in/out指令)来操作这些寄存器,实现与设备的通信。

另一种是通过内存映射 I/O方式,将所有设备的控制寄存器映射到内存空间中。这样,CPU就可以像读写内存一样,直接读写设备的控制寄存器和数据缓冲区。这种方式相对于端口 I/O方式来说,更加灵活和方便。

总结

键盘输入的处理过程包括键盘设备控制器将扫描码存储、中断请求发送给CPU、中断处理程序将扫描码转换为ASCII码并存储在键盘缓冲区、键盘驱动程序读取缓冲区的扫描码并传递给应用程序,最后显示驱动程序控制显示器显示字符和更新屏幕图像。

设备控制器位于操作系统与硬件之间的中间层,负责处理外设硬件与CPU之间的通信和操作。它通过与操作系统进行交互,将外设的功能和状态信息传递给操作系统,并接收来自操作系统的指令来控制设备的运行。

设备控制器内部包含有自己的逻辑功能和与CPU通信的寄存器,例如状态寄存器、命令寄存器和数据寄存器。通过操作系统向这些寄存器写入命令,可以指示设备执行相应的输入/输出操作,通过读取这些寄存器,操作系统可以获取设备的状态信息。

通过本文的介绍,我们可以初步了解键盘输入的处理过程和设备控制器的作用,从而更好地理解操作系统与硬件之间的交互过程。


我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助。

🌟 欢迎关注努力的小雨!🌟

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于STM32开发的智能家居照明控制系统
  • 港湾周评|IPO底稿的“萝卜章”与鸭脖大王被立案调查
  • unbuffer禁用输出缓存,实现实时打印解决日志乱序
  • 谷歌浏览器字体模糊不清怎么办
  • SQL高级编程:掌握自定义函数和过程的艺术
  • 牛客面经学习笔记(三)
  • 【Go语言初探】(三)、运行程序报错:Cannot find package “xxx“
  • 复习之 java 锁
  • CMake详解-捡重要的讲
  • 【漏洞复现】某某康达vpn——list_base_config.php——命令执行
  • Qt Xlsx使用教程、Qt操作Excel、Qt生成Excel图表、跨平台不依赖Office 直接使用源码
  • 优化业务流程的关键:深入探讨BPA流程设计
  • qt-11基本对话框(消息框)
  • 【图形验证和AI智能及CHATGPT对抗影响的是用户体验】
  • 【大模型系列篇】Transformers综述--邱锡鹏
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • JavaScript创建对象的四种方式
  • JavaWeb(学习笔记二)
  • js中的正则表达式入门
  • Mybatis初体验
  • Spring Boot快速入门(一):Hello Spring Boot
  • storm drpc实例
  • Travix是如何部署应用程序到Kubernetes上的
  • TypeScript迭代器
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从零开始的无人驾驶 1
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 回顾 Swift 多平台移植进度 #2
  • 将回调地狱按在地上摩擦的Promise
  • 蓝海存储开关机注意事项总结
  • 深入浅出webpack学习(1)--核心概念
  • 为什么要用IPython/Jupyter?
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 找一份好的前端工作,起点很重要
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​水经微图Web1.5.0版即将上线
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • ###C语言程序设计-----C语言学习(3)#
  • #define与typedef区别
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)常见O(n^2)排序算法解析
  • (C语言)逆序输出字符串
  • (HAL库版)freeRTOS移植STMF103
  • (Java入门)学生管理系统
  • (rabbitmq的高级特性)消息可靠性
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (论文阅读40-45)图像描述1