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

news2024/9/22 1:31:44

流程初探

键盘是我们最常用的输入硬件设备之一。作为程序员,你知道当我们敲击键盘上的字母"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 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Processing练习之鼠标控制线段粗细

案例代码如下: import processing.pdf.*; import java.util.Calendar; boolean savePDF false; int tileCount 20; int actRandomSeed 0; int actStrokeCap ROUND; void setup(){ size(600,600); } void draw(){ if(savePDF)beginRecord(PDF, timestamp()"…

回调函数,字符函数,字符串函数

前言:上一趴我们学习了指针。那么今天我们来学习新的知识,回调函数,字符函数,字符串函数。 1 回调函数 什么是回调函数呢?回调函数就是通过函数指针调用的函数。 如果你把函数的指针(地址)作…

加热系统加入达温即停和保温功能

加热系统加入达温即停和保温功能 引言 ​ 我们前一节, 是通过控制io口, 直接控制加热的开关, 但是这太简单粗暴了, 如果只是那样, 和普通的家居电器,是没区别的, 我们想要更智能一点, 就是像咱们自己家的热水壶那样, 水烧滚了(水温达到100摄氏度), 就自动停止了. 加热功能&a…

SQL每日一练-0816

今日SQL题:计算每个项目的年度收入增长率 难度系数:🌟☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额,并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…

JS周结 day0817

ok了家人们,今天这周学习了JavaScript,我们一起看一下吧 一.JavaScript概述 1.1 应用场景 JavaScript 用来做前端页面校验 JavaScript 可以实现网页的一些动画效果,例如:轮播图 1.2 JavaScript介绍 JavaScript 是一门跨平台、…

华为OD(C卷,200分)- 智能驾驶

(C卷,200分)- 智能驾驶 题目描述 有一辆汽车需要从 m * n 的地图左上角(起点)开往地图的右下角(终点),去往每一个地区都需要消耗一定的油量,加油站可进行加油。 请你计算汽车确保从从起点到达终点时所需的最少初始油量。 说明: 智能汽车可以上下左右四个方向移动 地图…

Monaco Editor组件使用详解

Monaco Editor 是由微软开发并开源的一款代码编辑器,它是 Visual Studio Code(VS Code)的核心部分。Monaco Editor 提供了丰富的特性,包括语法高亮、代码折叠、代码提示(IntelliSense)、多光标选择、搜索和…

RabbitMQ消息队列总结

RabbitMQ那些事 参考一. `RabbitMQ`介绍1.1 Java工程师1.1.1 RabbitMQ学习目标1.1.2 消息队列介绍1.1.3 RabbitMQ介绍各自属性介绍(❤❤❤)二. `RabbitMQ`安装1. 基于Linux1.1 安装1.2 常用命令1.3 后台管理开启与面板介绍三. 客户端`SDK`操作(❤❤了解)1. 客户端依赖1. 生产者…

【区块链+金融服务】中国银联区块链可信存证服务 | FISCO BCOS应用案例

随着金融行业信息化的快速推进,“互联网 金融”业务产生了海量的电子数据。例如,截止到 2022 年第二季度, 全国累计信用卡发卡数量约 8.07 亿张,累计银行卡应偿信贷余额为 8.66 万亿元,累计信用卡逾期半年未尝信贷 总…

18124 N皇后问题

### 详细分析 这是一个经典的N皇后问题。我们需要在N\*N的棋盘上放置N个皇后,使得任意两个皇后不在同一行、同一列或同一对角线上。可以使用回溯算法来解决这个问题。 ### 伪代码 1. 定义一个函数countSolutions,输入为N,输出为N皇后问题的解…

尚硅谷MYSQL(5-6章)

排序和分页 排序 如果没有使用排序操作的话 查询出来的数据是按添加的顺序排序的 ORDER BY是来进行排序的 后面可以添加ASC升序 DESC降序 如果后面没有显示指明排序的方式的话 则默认按照升序排序 where中不能使用列的别名 我们在使用sql语句的时候 她的执行顺序不是从第一…

Python 环境搭建指南 超详细

Python是由荷兰⼈吉多范罗苏姆(Guido von Rossum,后⾯都称呼他为Guido)发明的⼀种编程语言 1. 1989年圣诞节:Guido开始写Python语⾔的编译器。2. 1991年2⽉:第⼀个Python解释器诞⽣,它是⽤C语⾔实现的&…

STM32之点亮LED灯

使用固件库实现LED点灯 LED灯: LED灯,是一种能够将电能转化为可见光的半导体器件 控制LED灯: LED灯的正极接到了3.3V,LED灯的负极接到了PA1,也就是GPIOA1引脚 只需要控制PA1为相对应的低电平,即可点亮对…

政务大数据解决方案(十)

政务大数据解决方案通过建立全面的集成数据平台,整合来自各政府部门的异构数据,运用大数据分析、人工智能和机器学习技术对数据进行深度挖掘与智能化处理,提供实时精准的决策支持,从而提升政策制定和实施的科学性与效率。该方案包…

retrofit+livedata+viewModel+moshi处理数据

1.从源码角度看,只需要定义一个CallAdapterFactory 处理结果livedata接受默认的CallAdapterFactory 是DefaultCallAdapterFactory // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) //package retrofit2;i…

那不勒斯足球俱乐部在 The Sandbox 中启动

访问 The Sandbox 中的那不勒斯足球俱乐部快闪商店,赢取比赛门票和签名商品。 我们很高兴地宣布,我们将与意大利著名职业足球俱乐部那不勒斯足球俱乐部展开合作,在 4 个 UGC 体验中开设 “快闪商店”。在这个以传奇球队为灵感来源的独特数字…

[Meachines] [Medium] poison LFI+日志投毒+VNC权限提升

信息收集 IP AddressOpening Ports10.10.10.84TCP:22,80 $ nmap -p- 10.10.10.84 --min-rate 1000 -sC -sV 22/tcp open ssh OpenSSH 7.2 (FreeBSD 20161230; protocol 2.0) | ssh-hostkey: | 2048 e3:3b:7d:3c:8f:4b:8c:f9:cd:7f:d2:3a:ce:2d:ff:bb (RSA) | 256 …

Linux - 基础工具使用

文章目录 一、yum1、介绍2、功能3、语法4、使用 二、rzsz1、安装rzsz的指令2、介绍3、使用 三、vim基础使用1、介绍2、基础使用 四、gcc/g使用1、生成可执行文件过程2、语法3、常用选项4、编译过程5、动静态库6、链接外部库 一、yum 1、介绍 Linux中的yum是一个强大的软件包管…

部署 K8s 图形化管理工具 Dashboard

文章目录 一、Dashboard 概述二、GitHub 地址三、Dashboard 部署安装1、选择兼容版本2、下载配置文件3、添加 Dashboard 的Service类型4、应用部署5、查看 kubernetes-dashboard 命名空间下资源状态6、创建访问账户7、授权8、获取账号token9、1.24 版本以后的需要创建一个Pod 四…

STM32入门开发操作记录(九)——外部时钟定时器

目录 一、项目准备1. 工程模板2. 器件接线 二、外部时钟1. 端口复用2. 流程示意 三、定时器模块Timer.cTimer.h 四、遮光计数 一、项目准备 1. 工程模板 本篇项目所用模板包含以下模块,声明函数见头文件,模块添加和函数功能详见往期记录。   2. 器件…