设备驱动与文件系统:02 键盘

article/2025/7/13 2:16:55

操作系统中键盘驱动的讲解

在这一讲中,我将为大家讲解键盘相关内容。从上一讲开始,我们进入了操作系统第四个部分的学习,也就是操作系统对设备的驱动与管理。在这里插入图片描述
上一讲我们探讨的是显示器,并且提到,一个终端设备是由显示器和键盘共同组成的,显示器属于终端设备的输出部分,我们在显示器上看到的内容就是其输出结果。而键盘,是我们进行最基本输入操作的设备 ,所以这一节,我要为大家讲解的就是键盘是如何被驱动的,以及操作系统是怎样使用键盘的

外设工作基本原理回顾

要讲述键盘的故事,我们仍然需要从回顾上次讲的外设工作的基本原理开始。从上次课到今天的内容,再到下次课要讲的磁盘的使用和管理,都离不开那张外设工作的基本原理图。
在这里插入图片描述

上节课我讲过,外设工作的基本原理非常简单。外设的工作流程是:CPU发出一条读或写的指令,当外设工作完成后,会向CPU返回一个中断。无论是终端设备还是其他任何外设,基本思路都是如此。

想要实现外设的驱动,需要做三件事:

  1. 核心部分:向设备控制器的某些寄存器端口或存储区域发出读写指令,这是计算机使用外设的核心,通常表现为几条指令。但要写出这些指令,必须对硬件有深入了解,清楚硬件的端口、指令格式及含义等,这些细节处理起来很麻烦,虽然原理简单,但实际操作复杂。
  2. 统一文件视图:操作系统为了隐蔽硬件细节,将所有外设都以文件的形式呈现。根据文件名或文件对应的结构信息,决定最终执行哪一段与硬件交互的代码,将底层与硬件交互的代码通过文件方式进行封装,这是操作系统进行外设管理的第二个重要方面。
  3. 中断处理:通常在设备完成读写操作后,进行后续相关工作,这是外设驱动的第三个部分。

将这三个部分弄明白,对于任何外设的管理原理也就基本掌握了。简单总结一下,第一部分是通过out指令向外设发送命令;第二部分是形成统一的文件视图;第三部分是进行中断处理 。掌握了这三个部分,整个外设工作原理就能清晰明了。

键盘驱动与操作系统对键盘的使用

对于键盘而言,它正好对应着中断处理这一部分。因为键盘的操作是由用户发起的,用户按下按键后就会产生中断,然后进行中断处理,最终将信息传递回上层的文件系统。这也再次印证了,只要理解了外设驱动的三个核心部分,学习任何设备的驱动原理都是相通的。

讲完今天关于键盘的内容,我们就能弄清楚计算机的输入输出原理。上一讲的显示器相当于输出设备,今天的键盘则是输入设备,当这两个设备的原理都搞清楚后,一台基本的计算机就能够正常使用了,即便没有驱动磁盘,只要有CPU、内存、键盘和显示器,计算机也可以运行。

那么,关于键盘的故事该从哪里开始讲起呢?用户敲下按键后会产生什么结果,又会触发哪些操作呢?答案是中断,按下按键后就会触发中断,所以整个故事应该从中断处理开始
在这里插入图片描述

从硬件参与计算的角度来看,有两条路径:一条是从CPU发起,通过out指令向外设发送指令;另一条是从硬件产生中断信号,向CPU进行中断请求 。而这两条路径最终都会回归到文件系统的统一视图上。今天我们要讲的就是第二条路,从中断开始,因为设备(键盘)一旦有操作就会产生中断。当然,从中断开始,首先得了解中断初始化,即键盘中断被初始化成了什么函数,这个函数又负责做什么事情。

通过查阅手册可知,键盘中断对应21号中断。通过设置,将21号中断关联到特定的处理程序,当发生中断时,就会执行这个中断处理函数,键盘的故事也就由此展开。

中断处理函数的工作

接下来,我们看看中断处理函数具体做了哪些事情。中断处理函数的第一句是in指令,有out指令用于输出字节,相对应的,in指令就是读入一个字节。通过这条核心指令,我们可以将键盘控制器中60端口的内容读取到AL寄存器中。要理解这一步,需要具备一定的硬件知识,因为inout这类与CPU和设备控制器寄存器交互的指令,都需要参考硬件手册,明确端口对应的含义。在这里,60端口存放的是扫描码,通过in指令,扫描码就被存储到了AL(在AX寄存器中)。
在这里插入图片描述

获取扫描码后,根据不同的扫描码,需要调用相应的table来执行对应的操作。这很好理解,不同的按键对应不同的扫描码,也就需要执行不同的操作。比如,如果扫描码对应的是字母“a”,那就产生字符“a”的ASCII码,然后向上传递;如果是其他按键,如大小写切换键,就执行相应的功能操作。

现在,我们已经有了扫描码,接下来就要根据扫描码获取对应的ASCII码,这就需要用到keymapkeymap其实就是一个存储着各种可显示字符ASCII码的表,例如数字、字母,以及按下Shift键时对应的特殊字符(如叹号、@、#等)的ASCII码 。将keymap表的起始地址存入EBX寄存器,再结合刚才获取的扫描码(作为表的偏移量),就可以找到按下按键所对应的ASCII码,并将其赋值给AL寄存器。至此,我们就成功得到了按键对应的ASCII码。

ASCII码的处理与存储在这里插入图片描述

得到ASCII码后,下一步就是将其放置到合适的位置。显然,ASCII码需要被放到缓冲队列中,就像上一次讲显示器输出时,数据会被写入缓冲队列等待处理一样。在这里,键盘输入的ASCII码会通过put_queue操作,放入read_q队列中。put_queue的操作过程也很简单,就是获取read_q队列的头部指针,然后将ASCII码存储到队列头部。

到这一步,似乎键盘输入的处理已经完成了,将得到的ASCII码放入队列中,上层程序(如执行scanf的进程)在需要时就可以从队列中获取数据。这部分与显示器输出时数据写入队列,以及上层程序通过printf等函数从队列获取数据的原理是一样的,只是这里是输入操作,将write相关操作替换为read操作即可。

键盘输入的“回显”处理在这里插入图片描述

不过,我们还需要考虑一个环节,那就是“回显”。“回显”其实就是对输入字符进行一些处理后,将其再次进行输出显示等操作 。在将字符放入队列时,对于一些可显示字符,通常需要进行“回显”操作,也就是将其显示在屏幕上。

“回显”的过程和前面将ASCII码放入read_q队列类似,同样是将字符数据写入相关队列(这里仍然是read_q队列),然后在“回显”操作中,通过调用console_write函数,将字符显示在屏幕上。

总结与拓展思考在这里插入图片描述

我们可以总结一下键盘处理的整个流程:从硬件产生中断开始,中断处理程序获取扫描码,并将其转换为ASCII码,然后将ASCII码放入read_q队列中,在这个过程中可能会涉及一些中间处理和“回显”操作,最终上层程序从队列中获取数据进行后续处理 。
在这里插入图片描述

将键盘的处理和上次显示器的处理结合起来看,我们会发现它们都通过文件接口进行操作。输出时使用tty_write,输入时使用tty_read,分别操作write_qread_q队列 。这再次印证了操作系统进行设备处理的三个核心部分:通过out指令与硬件交互、形成统一的文件视图、进行中断处理。无论是输入设备还是输出设备,其驱动原理都围绕这三个方面展开。

最后,我再给大家留下一个思考和实践的小任务。在上次的内容中,我们提到按下F12键要输出星号。从今天讲解的键盘驱动原理出发,实现这个功能其实并不难。当前按下F12键时,是由func函数进行处理的,我们只需要将其修改为自定义的函数(如my_func)。在my_func函数中,我们可以设置一个标志位flag,按下一次F12键,将flag置为1,此时输出全为星号;再按一次F12键,将flag置为0,恢复正常输出。同时,在tty_write函数中,根据flag的值判断是否将输出字符替换为星号 。大家可以在实验中尝试实现这个功能,通过实践,对操作系统设备驱动的理解将会上升到一个新的层次。


http://www.hkcw.cn/article/AlgmjVGvGk.shtml

相关文章

工作流引擎-18-开源审批流项目之 plumdo-work 工作流,表单,报表结合的多模块系统

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…

Windows环境下Scoop包管理工具的全面指南

🧩 一、Scoop核心特性与设计理念 定位与优势 专注于开源命令行工具和便携式(Portable)应用,无需管理员权限即可安装,减少系统污染。自动管理环境变量(通过shims目录),安装后即时可用…

谷粒商城-分布式微服务项目-高级篇[三]

十五、商城业务-支付 15.1 支付宝支付 15.1.1 进入“蚂蚁金服开放平台” 支付宝开放 平台地址: 支付宝开放平台 15.1.2 下载支付宝官方 demo,进行配置和测试 开发者文档:支付宝开放平台文档中心 电脑网站支付文档:小程序文…

EchoMimicV2:迈向引人注目、简化的半身人类动画

今天介绍EchoMimicV2,EchoMimicV2是阿里蚂蚁集团推出的半身人体AI数字人项目,输入参考图片、音频、和手部姿势序列生成动画视频(对图片的规范要求比较高,图片规范的话效果还可以),感兴趣的还可以去了解一下…

SpringBoot手动实现流式输出方案整理以及SSE规范输出详解

背景: 最近做流式输出时,一直使用python实现的,应需求方的要求,需要通过java应用做一次封装并在java侧完成系统鉴权、模型鉴权等功能后才能真正去调用智能体应用,基于此调研java实现流式输出的几种方式,并…

vuex的使用

❀ ❀ ❀ ❀ ❀ ❀ ❀ vuex的官网 ❀ ❀ ❀ ❀ ❀ ❀ ❀ ❀ 这里用法不纯粹。用户toolbar页面切换时的传参。若后期有更好的方式,会更改。因vuex用于全局,在这个场景下使用有点大材小用了 其中需要注意的点就是更新、获取状态 更新状态。updateProjec…

Calendar和Datepicker

Displaystart Displayend "2024-10-8" selectedDate属性 设定选择的日期 在 C# 中,DateTime? date1 表示 **一个可空的 DateTime 类型变量**。 ?.是不为零 ?是可以为零0️⃣ 多选 selectionmode none不让选 singlerange shift …

赛事获奖|TsingtaoAI荣获“雄才杯”2025创新创业大赛总决赛奖项

5月16-18日,由雄安新区党工委人才工作领导小组办公室主办的“雄才杯”2025创新创业大赛总决赛在雄安新区成功举办。TsingtaoAI凭借“基于DeepSeek的具身智能实训”项目荣获优胜奖,本项目为参赛项目中唯一的教育科技服务类获奖项目。 大赛背景 本次总决…

初识vue3(vue简介,环境配置,setup语法糖)

一,前言 今天学习vue3 二,vue简介及如何创建vue工程 Vue 3 简介 Vue.js(读音 /vjuː/,类似 “view”)是一款流行的渐进式 JavaScript 框架,用于构建用户界面。Vue 3 是其第三代主要版本,于 …

C++面向对象(二)

面向对象基础内容参考: C面向对象(一)-CSDN博客 友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定…

基于AIS的海洋观测应用

知识星球:数据书局。打算通过知识星球将这些年积累的知识、经验分享出来,让各位在数据治理、数据分析的路上少走弯路,另外星球也方便动态更新最近的资料,提供各位一起讨论数据的小圈子 1.背景 船舶自动识别系统(Aut…

imx6ull(0):烧录、启动

参考内容: i.MX6ULL Applications Processors for Industrial Products i.MX6ULLApplicationsProcessorReferenceManual 正点原子 I.MX6U嵌入式Linux驱动开发指南 以及 广大工程师们在互联网上分享的学习笔记(一样东西学的人多的时候所带来的优势) 例如这里我用…

CloudCompare——使用CSF算法进行点云高程归一化

目录 1.算法原理2.软件操作2.1 CSF算法2.2 生成CSF网格2.3 平滑网格(可选)2.4 计算点云到网格的距离2.5 将计算得到的距离赋值给高程 3.结果展示3.1 原始点云3.2 归一化结果 1.算法原理 点云高程归一化的关键在于获取原始点云地面数据的DEM。可选取CSF算法提取样地点云地面DEM。…

【C语言】C语言经典小游戏:贪吃蛇(下)

文章目录 一、游戏前准备二、游戏开始1、游戏开始函数(GameStart)1)打印欢迎界⾯(WelcomeToGame)2)创建地图(CreateMap)3)初始化蛇⾝(InitSnake)4…

循序渐进 Android Binder(一):IPC 基本概念和 AIDL 跨进程通信的简单实例

Binder 给人的第一印象是”捆绑者“,即将两个需要建立关系的事物用某些工具束缚在一起。在 Android 中,Binder 是一种高效的跨进程通信(IPC)机制,它将可以将运行在不同进程中的组件进行绑定,以实现彼此通信…

ISBN书号查询接口如何用PHP实现调用?

一、什么是ISBN书号查询接口 ISBN数据查询接口是一项图书信息查询服务。它基于全球通用的ISBN编码系统,帮助用户快速获取图书的详细信息,包括书名、作者、出版社、出版时间、价格、封面等关键字段。 该接口广泛应用于电商平台、图书馆管理系统、二手书…

Linux(信号)

目录 一 什么是信号 二 Linux中的信号 1. 查看信号:kill -l 2. 自定义信号的处理方式 2.1 API 2.2 demo 3. 理解信号的发送 4. 信号产生的方式 三 信号保存 四 捕捉信号 1. 先来说说硬件中断: 1. 谁调度操作系统? 2. 理解时间片…

[Windows] Simple Live v1.8.3 开源聚合直播 :支持哔哩哔哩 虎牙 斗鱼 抖音

Simple Live 是一款基于 AllLive 项目 开发的开源聚合直播 APP,支持 哔哩哔哩、虎牙、斗鱼、抖音 等主流平台,具备 无广告、低占用、弹幕互动 等核心优势。其核心功能包括:全平台覆盖:一站式聚合多平台直播资源,无需切…

第十天:Java反射

反射 反射就是:加载类,并编写代码获取类中的成员变量,方法,构造器等。 注意:反射,注解,动态代理就是用来学习框架做框架的,在平时业务开发需求上很少用到。 1 反射学什么&#xf…

整数有约 | 刘乾专访:继续预训练策略与数据优化之道

人工智能多语言处理近年来得到了极大的关注,尤其是在以东南亚为代表的小语种环境中,其特殊的语言多样性和语料库稀缺性使得研究挑战和机遇并存。在现有的自然语言处理模型中,英语和中文因为有海量高质量数据的支持,常被作为核心语…