当前位置:   article > 正文

csapp--键盘驱动程序的分析与修改

键盘驱动程序的分析与修改

本实验包含 2 关,要求如下:
Phase 1
键入 F12,激活功能,键入学生本人的姓名拼音,首尾字母等显示
比如:zhangsan,显示为:hagsa*
Phase 2
键入“学生本人的学号” :激活功能,键入学生本人的姓名拼音,首尾字母等显示
比如:zhangsan,显示为:hagsa*,
键入“学生本人的学号-” :取消显示*功能
提示:完成本实验需要对 lab4/linux-0.11/kernel/chr_drv/目录下的 keyboard.s、console.c 和 tty_io.c 源文件进行分析,理解按下按键到回显到显示频上程序的执行过程,然后对涉及到的数据结构进行分析,完成对前两个源程序的修改。修改方案有两种:
 在 C 语言源程序层面进行修改
 在汇编语言源程序层面进行修改

四、实验步骤及实验分析

首先进行环境的安装

1.输入指令,下载以及安装相关资源并解压
在这里插入图片描述

Phase_1
2.进行F12按键的功能修改
进入文件夹

在这里插入图片描述

keyboard.S函数修改,增加全局变量f12Flag
在这里插入图片描述
函数func中的加入call change_f12Flag
在这里插入图片描述
在/kernel/chr_drv/console.c中增加函数change_f12Flag

在这里插入图片描述
f12Flag置位时,将英文字母显示为‘*“

在这里插入图片描述

改为输入名字时,进行改变

在这里插入图片描述

运行指令截图(如下)
在这里插入图片描述

运行结果截图(如下)

在这里插入图片描述

Phase_2

指令输入
在这里插入图片描述

分析:基于第一阶段的基础上,扩展的功能是需要正确输入本人的学号进行触发“”处理,如“2018211252liubaolin”;并且若本人学号输入为”2018211252-liubaolin”,那么就不会出发“”的处理.基于以上分析,在console.c文件中进行修改。而具体来说,因为console.c文件主要是包含控制初始化程序和控制台写函数con_write();如果是写队列中取出的字符是普通显示字符代码,就直接从当前映射字符集中去除对应的显示字符,并放到当前光标所处的显示位置,即直接显示该字符。而此处,我们借助这个原理,稍作改变,增加条件判断语句,如果经过判断符合”2018211252liubaolin”,那么就将首字母与末尾字母和与之相同的字母的输出改为“”输出;若不是,那么正常输出。并且需要判断输入是“2018211252-liubaolin”时,那个”-“符号决定是否关闭”“处理,按照如此思路解决即可。当然为了保证“*”被激活一次之后,就一直处于激活状态,那么我们需要查看类似于”f12Flag”功能的实现方案。在本实验需要对 lab4/linux-0.11/kernel/chr_drv/目录下的 keyboard.s、console.c 和 tty_io.c 源文件进行分析,理解按下按键到回显到显示频上程序的执行过程,然后对涉及到的数据结构进行分析,完成对前两个源程序的修改。我采取在C语言源程序层面进行修改。

逐步程序分析
1.首先基于keyboard.S源文件的分析,找到如下图;这是一段对子程序处理功能键,把功能键扫描码变成转义字符并存放入到读队列中,并且调用修改插入的函数cahnge_f12Flag,很明显只要键入F12,就会调用该函数。
在这里插入图片描述

2.并且根据规则可知,键入F12,因为初始时,f12Falg = 0,那么进入函数cahnge_f12Flag()中就会出现的如下改变:刚开始是0,那么进入该函数后,赋值为1。

在这里插入图片描述

3.根据f12Flag在上一步被赋值为1,那么如下程序就可以执行“”的功能,并且直到f12Falg = 0 时,关闭”“的供能。
在这里插入图片描述
基于以上的f12Flag的相关执行程序,那么我只需要根据以上步骤将f12Flag的键入输入改为此处的学号的判断,并且将num标识符作为自己的类似于f12Flag的功能实现的全局变量即可。

下列进行console.c源代码修改
1.在此处添加全局变量extern int num = 0;作为标志,起到为判断结果做记号的功能。功能类似于extern int f12Flag的作用。

在这里插入图片描述

2.修改主体部分的con_write函数,做学号的输入的判断如”2018211252liubaolin”的输入判断;如果输入正确的话,就进行num = 1的赋值;那么在后续的运行测试当中,若未输入“2018211252-”,因为一直有num = 1,那么”“功能一直都处于被激活的状态,会每次将我的姓名拼音当中的”l”和“n”都以“”的形式显示出来。若输入的是“2018211252-”那么就会关闭”*”的激活状态,使之处于关闭前状态。

在这里插入图片描述

运行测试结果
经过反复的测试验证,具备键入“学生本人的学号” :激活功能,键入学生本人的姓名拼音,首尾字母等显示;键入“学生本人的学号-” :取消显示*功能。
在这里插入图片描述

运行结果信息分析:
1.第一次输入”liubaolin”会发现拼音是正常的输出。因为未激活“”状态。
2.第二次输入”2018211252liubaolin”,会发现输出已经将学生本人的姓名拼音,首尾字母等显示
。完成 “”状态的激活,以及实现“”功能。
3.第三次输入“liubaolin”,”“功能正常执行。
4.第四次键入”2018211000-“,”
“功能仍然正常执行,因为不符合我的学号”2018211252“。
5.第五次键入”2018211253-“,”“功能仍然正常执行,因为不符合我的学号”2018211252“。
6.第六次键入”2018211252-liubaolin“,”
”功能被关闭,并且正常输出我的本人的姓名拼音“liubaolin”。
7.第七次键入”liubaolin”,会发现拼音是正常的输出,因为“*”状态处于关闭状态。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号