本文介绍: 的功能就是从键盘控制器寄存器缓冲区读取扫描码,再根据扫描码找到用户键盘输入字符,如果输入字符显示字符,那就会把扫描翻译对应显示字符的 ASCII 码,比如用户键盘输入的是字母 A,是显示字符,于是就会把扫描翻译成 A 字符的 ASCII 码。我们电脑设备可以接非常多的输入输出设备比如鼠标键盘网卡硬盘打印机等,每个设备用法功能都不相同,那操作系统如何把这些输入输出设备统一管理的呢?这样做是为了减少对设备的频繁操作,那 CPU 是如何与设备的控制寄存器数据缓冲区进行通信的?

一、设备控制器

我们电脑设备可以接非常多的输入输出设备,比如鼠标键盘网卡硬盘打印机等,每个设备的用法和功能都不相同,那操作系统是如何把这些输入输出设备统一管理的呢?

为了屏蔽设备之间的差异,每个设备都有一个叫设备控制器组件,比如硬盘硬盘控制器,显示器视频控制器。

设备管理器里有芯片,可以执行自己逻辑,也有自己寄存器用来与 CPU 进行通信,比如:

控制器分为三类寄存器,分别是状态存器命令存器以及数据存器,作用如下

输入输出设备分为两大类:块设备(Block Device)和字符设备(Character Device):

块设备通常传输数据量会非常大,于是控制器设立了一个可读写数据缓冲区

这样做是为了减少对设备的频繁操作,那 CPU 是如何与设备的控制寄存器和数据缓冲区进行通信的?:

存储系统的 IO 是整个系统最慢的一个环节,所以 Linux 提供了不少缓存机制提高 IO 的效率

正题来辣~ 键盘敲入字母时,发生了什么

CPU 里面内存接口,直接和系统总线通信然后系统总线再接入一个 IO 桥接器,这个 IO 桥接器,另外一边接入内存总线,使得 CPU 和内存通信。再一边,又接入了一个 IO 总线,用来连接 IO 设备,比如键盘鼠标等

当有用户输入了键盘字符,键盘控制器就会产生扫描码数据,并将其缓冲在键盘控制器的寄存器中,紧接着键盘控制器通过总线给 CPU 发送中断请求

CPU 发生中断请求后,操作系统保存中断进程的 CPU 上下文,然后调用键盘的中断处理程序

键盘的中断处理程序是在键盘驱动程序初始化注册的,那键盘中断处理函数的功能就是从键盘控制器的寄存器的缓冲区读取扫描码,再根据扫描码找到用户在键盘输入的字符,如果输入的字符是显示字符,那就会把扫描码翻译对应显示字符的 ASCII 码,比如用户在键盘输入的是字母 A,是显示字符,于是就会把扫描码翻译成 A 字符的 ASCII 码。

得到了显示字符的 ASCII 码后,就会把 ASCII 码放到「读缓冲区队列」,接下来就是要把显示字符显示屏幕了,显示设备的驱动程序定时从「读缓冲区队列读取数据放到「写缓冲区队列」,最后把「写缓冲区队列」的数据一个一个写入到显示设备的控制器的寄存器中的数据缓冲区,最后将这些数据显示在屏幕里。

显示出结果后,恢复被中断进程的上下文

原文地址:https://blog.csdn.net/songbijian/article/details/134677812

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23620.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注