23.键盘

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.键盘 是输出型外设;


【1】外设工作原理

【图解】外设工作原理:

  • 步骤1:Cpu向外设控制器发出指令(如写命令),向外设控制器中的寄存器(或存储器)读写数据;如显卡控制器;
  • 步骤2:写入完成后,外设控制器发出中断请求通知cpu写入完成;
  • 步骤3:cpu处理外设中断;

补充:外设驱动主要做3件事情(外设就包括了显示器,键盘,鼠标等)

  • 事情1: cpu向外设控制器的寄存器或端口发出读写指令(out指令),最核心的部分;
  • 前提是cpu需要知道硬件端口,数据格式等细节,而这些细节非常麻烦;
  • 事情2: 操作系统为了隐藏细节,做了一个统一的文件视图,把外设抽象为文件,文件inode结构体就封装了外设端口,数据格式等细节;
  • 事情3:cpu处理外设中断(外设控制器在完成相应操作后会向cpu发出中断) ;

补充2: 其他外设工作原理类似,同上述外设驱动的3件事情;


【2】键盘驱动代码实现

1)键盘中断初始化

 【图解】
1)0x21号中断是键盘中断,键盘中断处理程序为 keyboard_interrupt ;
2) _keyboard_interrupe 代码

_keyboard_interrupt:// 把0x60端口里的数据读入到al寄存器; inb $0x60, %al // 调用 key_table + eax*4 call key_table(, %eax, 4)

3)处理扫描码 key_table + eax*4  

【图解】
调用 do_self 函数找到键盘按键对应的ASCII码;

3)从 key_map 取出 ASCII 码

 【图解】

  • 说明1)key_map: .byte 0, 27 .ascii “1234567890-=” ...
  • 说明2)shift_map: .byte 0, 27 .ascii “!@#$%^&*()_+” ...  // 按住shift键
  • 说明3)Movb(%ebx, %eax), %al // 把找到键盘按键的ASCII 送入al寄存器
  • 说明4) call put_queue 把ASCII 送入缓冲区(或队列)

4)put_queue 把 ASCII 放入缓冲区 con.read_q

 

【图解】
con.read_ q 中 con 指的是 console 控制器;
Read_q 指的是 读缓冲区;

补充:回显(可显示字符才会回显)


// 字符回显(打出在显示器)
void copy_to_cooked(struct tty_struct* tty) 
{GETCH(tty_read_q,c);// 判断是否需要回显 if (L_ECHO(tty)) {PUTCH(c, tty->write_q);// 立刻显示在屏幕上 tty->write(tty); }PUTCH(c, tty->secondary); ... 
}

 


【3】键盘处理总结

【3.1】键盘工作步骤

【图解】键盘工作步骤

  • 步骤1:操作系统启动时初始化键盘中断;
  • 步骤2:敲下键盘,发出键盘中断,cpu响应中断,执行键盘中断处理程序 keyboard_interrupt ;
  • 步骤3:keyboard_interrupt 程序从键盘控制器端口读取数据到al寄存器;
  • 步骤4:调用 do_self 函数找到键盘按键对应的ASCII码
  • 步骤5:把 ASCII 放入缓冲区 con.read_q
  • 步骤6:判断字符是否需要回显,若需要,则回显到屏幕上; 

【3.2】操作系统输入输出外设工作原理

把键盘处理流程与显示器处理流程合并在一起,如下图。
因为键盘是输出型外设,显示器是输入型外设;


【图解】
1)外设对外暴露的都是文件接口;
2)Tty设备读函数是 tty_read,tty设备写函数是  tty_write ; 分别操作 read_q 队列,write_q队列;(队列可以理解为缓冲区)

 

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

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

相关文章

like左匹配索引失效_Mysql索引失效的情况

一、前提条件1、创建三张测试表:DROP TABLE IF EXISTS user;CREATE TABLE user (idint(11) NOT NULL,name varchar(25) DEFAULT NULL,ageint(11) NOT NULL DEFAULT 0,update_time datetime DEFAULT NULL,first_name varchar(25) DEFAULT NULL,last_name varchar(25)…

基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心。最近稍微清闲点,正式推出1.0版,并在阿里云上部署了一个在线演示&#x…

24.原生磁盘的使用

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.磁盘操作抽象 第1层抽象:通过盘块号读写磁盘(或逻辑盘块号);第2层抽象:用队列缓存多个…

Oracle入门(十三C)之高级查询(下)

上章:Oracle入门(十三B)之高级查询(上) 四、常见组函数 SUM、AVG、COUNT、MIN、MAX分组函数忽略null 值。不能在WHERE 子句中使用组函数。MIN 和MAX 可用于任何数据类型;SUM、AVG只能用于数字数据类型五、子…

微软将降低Visual Studio对操作系统的影响

在过去几年中,为了将Visual Studio变成Windows上的第一开发工具,而不管用户的目标平台是什么,微软作出了重大努力。最近收购Xamarin及通过大力支持开源工具来支持非Windows设备,极大地增加了它对于各类开发人员的用处。这一做法的…

代码设置margintop_关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)...

关于元素设置margin-top能够改变body位置的原因及解决(子元素设置margin-top改变父元素定位)起因:在进行bootstrap的.navbar-brand内文字设置垂直居中时采用line-height高度,无法居中,发现源码.navbar-brand 设置了 padding: 15px 15px;(默认…

Oracle入门(九A)之用户的权限或角色

转载自 查看Oracle用户的权限或角色 前几天被问到一些关于权限和角色的问题,今天抽时间总结一下如何查看Oracle用户的权限或角色,在之前的博文中,写过 SYS,SYSTEM,DBA,SYSDBA,SYSOPER的区别与联系 以及 Oracle中定义者权限和调用者权限案例分…

25.从生磁盘到文件

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.文件:煮熟的磁盘,或熟磁盘; 本节的主要内容是讨论 如何从文件得到盘块号; 3.磁盘操作抽象&#xf…

Storm 1.0.1发布 .NET 适配也已到来

Apache Storm 1.0.0刚发布不久,1.0.1版本也在几天前到来;该版本主要是完成一些BUG修复和小的改进,通过一段时间新版本的使用,特将个人感受和一些遇到的问题归纳如下;另外 .NET 版本的 Storm 适配器也已经发布&#xff…

布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项

今天碰到个业务,他的 Redis 集群有个大 Value 用途是作为布隆过滤器,但沟通的时候被小怼了一下,意思大概是 “布隆过滤器原理都不懂,还要我优化?”。技术菜被人怼认了、怪不得别人,自己之前确实只是听说过这…

Oracle入门(十四)之PL/SQL

一、PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展。 (1)(2)(3)(5)(6)(7)数据类型Number 数字型Varchar2 …

26.文件使用磁盘的代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.文件内容复习: 1)如何从生磁盘抽象为文件? 核心是从字符流位置算出盘块号;2)如何算出盘…

.NET Core全新的配置管理[共9篇]

提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中。到了.NET Core的时候,很多我们…

redis存opc_KEPServerEX6完整免费版

KEPServerEX6完整免费版是一款先进的连接平台,主要用于为您的应用程序提供单一来源的工业自动化数据,通过连接、管理、监视和控制不通的自动化设备和应用程序来实现工业数据。具有严谨的技术特征,支持多达250种以上的通讯协定,可连…

Oracle入门(十四B)之PL/SQL异常处理

定义:程序执行过程的警告或错误成为例外(Exception) 一、常见预定义错误 二、非预定义错误及用户定义错误 (1)非预定义oracle错误其他标准的oracle错误,可以自定义异常名,将其与指定oracle错误关联,由系统触发。 例子…

C#读书雷达 | TW洞见

大家都知道,ThoughtWorks的技术雷达每年都会发布两到三次,它不但是业界技术趋势的标杆,更提供了一种卓有成效的方法论,即打造自己的技术雷达。在这种思想的驱动下,我们诞生了自己的读书雷达。但这份雷达略显high level…

27.目录与文件系统

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.第4层抽象:抽象整个磁盘到文件系统 【1】文件系统,抽象整个磁盘(第4层抽象) 【图解】整个磁盘抽象1…

dd命令打包多个文件_linux的tar命令详情;linux多个文件压缩打包到一个压缩文件...

tar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。Linux打包命令_tartar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式:单个文件压缩打包 tar czvf my.tar.gz file1多个文件压缩打包 tar czvf my.tar.gz file1 file2,...(file…

28.文件目录解析代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 背景: 磁盘格式化后,其组成部分包括引导块,超级块,inode使用位图,盘块使用位图&#xff0…

Oracle入门(十四A)之PL/SQL 基本结构

一、条件控制语句 &#xff08;1&#xff09;条件语句Iif…then…end if形式1:if <布尔表达式> then…(pl/sql和sql)…end if;&#xff08;2&#xff09;条件语句II if…then…else … end if 形式2&#xff1a;if <布尔表达式> then…(pl/sql和sql)else…end if;…