CSAPP LAB4 键盘驱动程序的分析与修改(更新中)

  1. 准备环境
  2. Demo
    键盘功能主要由如下几个部分实现:
    keyboard.S:接受键盘中断反馈的键盘码。
    tty_io.c :二级处理输入数据
    console.c :三级处理,之后打印到控制台
    .
    大致流程如下
    keyboards(read/put_queue)------>tty_io(write_queue)—>console(asm)---->屏幕
    .
    按实验提示找到关键文件keyboards.S console.c tty_io.c,后面要做的修改集中于这三个文件之中。运行Bochs模拟器,在按下F头的几个按键之后发现有迫真大量(四行)状态信息输出,影响实验操作,所以先注释掉keyboards.S中第214行对show_stat的调用。
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    在判断不是F12的语句( cmpb $11, %al ja end_func)后添加call指令,由于没有参数,所以不需要进行其他操作
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    在console.c中添加如下内容
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    在下方的con_write函数中添加如下内容,只修改打印到控制台后的状态
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    cd进入linux-0.11目录,make clean一下,然后重新make,cd …返回上层,输入./run运行模拟器,效果如下
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    虽然已经实现基本功能,但是按下F12时会有字符L溢出显示,修改如下
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    即处理F12后立即结束
  3. Phase1
    实验要求键入F12**※功能,键入学生姓名拼音,首尾字母等显示※,例如:zhangsan,显示为: ※ha※gsa※
    第二部分的需求的实现比较麻烦,以我的理解来看就是每输入一个字符进行一次判断,先记录坐标和状态,若为合法的拼音声母开头字符则将其记录并加密,若其中插入了非法字符则判断中断,还原显示,直到最后一个合法的韵母结尾为之,结束这一段的更改,其中更新状态也应该被退格键这些按键触发…
    .
    总结一下,先设置一个状态变量status_phase来对操作状态进行判断。当没有输入&完成了一串拼音的加密&由于一些非法字符的输入中断了加密时,这个值置为0。开始正常接收输入时,这个值置为1
    .
    随后,设置两个变量pos_cache&recent_length来控制对缓冲区内容的读取。pos_cache记录最后一次处理开始时的缓冲区内容起始位置,每输入一个字符操作recent_length进行增减后从记录的位置开始一次遍历,先删去输入数量的字符数,再调用__asm__根据缓存重新打印字符到控制台。
    .
    先来看看tty对各种行为的定义
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    以上定义了tty 等待队列中缓冲区操作宏函数,每一个tty结构中会附带三个tty_queue,发现缓冲区是利用循环队列实现的,在进行操作时并不会直接修改其中队列的缓冲区内存,我们可以利用这一点直接对缓冲区中的内容进行读取,然后在console.c中进行修改,调用csi_p和遍历缓冲区数据并输出到控制台来操作打印出的内容。
    CSAPP LAB4 键盘驱动程序的分析与修改(更新中)
    根据我的思路主要用到的函数(删除光标处的p个字符)然后在读取并打印内容时选择根据自己设定的偏移量进行读取