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

解密,键盘输入,探索,设备,控制器,奥秘 · 浏览次数 : 88

小编点评

**当我们敲击键盘上的字母\"A\"时,以下步骤会发生:** 1. **键盘设备控制器扫描码存储:**键盘设备控制器通过端口 I/O方式扫描码存储。 2. **中断请求发送给CPU:**键盘设备控制器向CPU发送中断请求。 3. **CPU保存上下文并调用中断处理程序:**CPU接收到中断请求后,保存当前进程的上下文,并调用键盘的中断处理程序。 4. **扫描码转换为ASCII码并存储在键盘缓冲区:**中断处理程序将扫描码转换为对应的ASCII码,并将其存储在键盘缓冲区中。 5. **键盘驱动程序读取缓冲区的扫描码:**键盘驱动程序负责读取键盘缓冲区中的扫描码。 6. **数据传递给应用程序:**键盘驱动程序根据需要将数据传递给相应的应用程序。 7. **显示驱动程序控制显示器:**显示驱动程序负责数据一个一个写入到显示设备的控制器的寄存器中的数据缓冲区并控制显示器的显示和屏幕图像的更新。 **总结:** 键盘输入的处理过程包括键盘设备控制器扫描码,中断请求发送,CPU保存上下文并调用中断处理程序,扫描码转换为ASCII码并存储在键盘缓冲区,键盘驱动程序读取缓冲区的扫描码并传递给应用程序,最后显示驱动程序控制显示器显示字符和更新屏幕图像。

正文

流程初探

键盘是我们最常用的输入硬件设备之一。作为程序员,你知道当我们敲击键盘上的字母"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通信的寄存器,例如状态寄存器、命令寄存器和数据寄存器。通过操作系统向这些寄存器写入命令,可以指示设备执行相应的输入/输出操作,通过读取这些寄存器,操作系统可以获取设备的状态信息。

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

与解密键盘输入:探索设备控制器的奥秘相似的内容:

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

通过对键盘输入的处理过程和设备控制器的作用的了解,我们可以更好地理解操作系统如何与键盘设备进行交互,并正确处理键盘输入。同时,了解设备控制器的作用可以帮助我们更好地理解操作系统与外设硬件之间的通信和控制过程。

跟我一起学习和开发动态表单系统-前端用vue、elementui实现方法(3)

基于 Vue、Element UI 和 Spring Boot + MyBatis 的动态表单系统前端实现解析 在现代企业信息系统中,动态表单是一种非常常见的功能。它可以根据业务需求灵活地调整表单结构,以满足不同的数据收集和展示需求。在本文中,我们将探讨一种基于 Vue、Element UI 和 S

基于FPGA的4x4矩阵键盘驱动设计---第一版

欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的4x4矩阵键盘驱动设计 第一版 功能说明: 1. 驱动4x4矩阵键盘:按下任意一个按键,解析出对应按键信息,并给出标志 使用平台:纯代码形式 使用语言:Verilog HDL 作者QQ:746833924 说明:本篇设计中不涉及

如何在Excel中实现手写签名?

# 前言 Hello各位,本葡萄又来啦,今天遇到的场景是这样的:在日常业务流程中,经常需要某一流程环节中相关责任人员进行审批签字,早期许多公司为了省事就直接会把这位负责人的签名以键盘打字(楷体)的形式打印出来,但是这样的坏处就是会导致所有的负责人的签名都是一样的,没有美感,为了解决这个问题,一些公司

解密prompt系列34. RLHF之训练另辟蹊径:循序渐进 & 青出于蓝

前几章我们讨论了RLHF的样本构建优化和训练策略优化,这一章我们讨论两种不同的RL训练方案,分别是基于过程训练,和使用弱Teacher来监督强Student 循序渐进:PRM & ORM 想要获得过程

解密Prompt系列33. LLM之图表理解任务-多模态篇

这一章我们聚焦多模态图表数据。先讨论下单纯使用prompt的情况下,图片和文字模态哪种表格模型理解的效果更好更好,再说下和表格相关的图表理解任务的微调方案

解密Prompt系列32. LLM之表格理解任务-文本模态

这一章我们聊聊大模型表格理解任务,在大模型时代主要出现在包含表格的RAG任务,以及表格操作数据抽取文本对比等任务中。这一章先聊单一的文本模态,我们分别介绍微调和基于Prompt的两种方案。

解密Prompt系列31. LLM Agent之从经验中不断学习的智能体

模型想要完成自主能力进化和自主能力获得,需要通过Self-Reflection from Past Experience来实现。那如何获得经历,把经历转化成经验,并在推理中使用呢?本章介绍三种方案

解密Prompt系列30. LLM Agent之互联网冲浪智能体

这一章介绍自主浏览操作网页的WebAgent和数据集:初级MiniWoB++,高级MIND2WEB,可交互WEBARENA,多模态WebVoyager,多轮对话WebLINX,复杂AutoWebGLM

解密Prompt系列29. LLM Agent之真实世界海量API解决方案:ToolLLM & AnyTool

很早之前我们就聊过ToolFormer,Gorilla这类API调用的Agent范式,这一章我们针对真实世界中工具调用的以下几个问题,介绍微调(ToolLLM)和prompt(AnyTool)两种方案。 真实世界的API数量庞大且多样:之前的多数工具调用论文,工具数量有限,工具相对简单具体,并且往往