终端设备的控制实验报告

终端设备的控制实验报告

实验目的与要求:

  1. 加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;

  2. 通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。

实验过程及数据记录:

  1. 配置环境文件
    终端设备的控制实验报告
  2. 进入相应的文件夹(目录为:~/oslab/linux-0.11/kernel_drv)

终端设备的控制实验报告

  1. 修改队列文件read_q(在chr_drv/tty_io.c的末尾添加)
    switch_show_char_flag用于判断F12键是否按下。

终端设备的控制实验报告

  1. 修改串口驱动头文件(include/tty.h)
    确保我们需要的功能已初始化。
    终端设备的控制实验报告

  2. 修改键盘键值映射表(kernel_drv/keyboard.S)
    F12的扫描码读入队列时,调用相应函数。
    终端设备的控制实验报告

  3. 添加字符“*”显示处理(linux-0.11/kernel_drv/console.c)
    从写队列将相应值输出时,进行过滤,把所有数据变成“星号“
    终端设备的控制实验报告

  4. 重新编译内核,make all

终端设备的控制实验报告

  1. 运行bochs

终端设备的控制实验报告

实验结果分析:

  1. 串口驱动头文件tty.h,存放并初始化调用需要的变量以及函数名(可执行函数表)。
  2. 每当按键有动作时,就会进入键盘中断处理程序(keyboard.S是键盘中断处理程序),调用keyboard_interrupt函数(此函数存在于kernelr_drv/keyboard.S)。
  3. 将读出的按键扫描码存入读队列中(文件read_q用于存放从键盘或串行终端输入的原始字符序列)。
  4. 存入后,会从读队列中将保存的值取出,再从函数中的key_table表格查询响应函数(这个表决定在扫描代码时调用哪个例程)
  5. 此时,调用完成,值存入辅助队列secondary和写队列write_q中(tty_io.c是IO设备控制台编译文件,用于存放经过行规则程序处理(过滤)过的数据,或称为熟(cooked)模式数据)。
  6. 调用console.c文件,进行屏幕显示处理,从 write_q队列中取出字符并显示在屏幕上。
  7. 重新编译内核,并运行bochs。

实验总结

Q:在原始代码中,按下 F12,中断响应后,中断服务程序会调用 func?它实现的是什么功能?
A:将F12转义成转义字符序列[[L,然后放入读队列中。

Q:在你的实现中,是否把向文件输出的字符也过滤了?如果是,那么怎么能只过滤向终端输出的字符?如果不是,那么怎么能把向文件输出的字符也一并进行过滤?
A:没有把向文件输出的字符过滤,因为更改的是con_write函数,在即将显示在屏幕上时才过滤字符。如果要把向文件输出的字符一并过滤,需要修改file_write函数中输出到文件缓冲区的字符,即写队列需要被更改过滤。

参考文章:
Linux-0.11操作系统实验7-终端设备的控制(https://blog.csdn.net/weixin_43166958/article/details/104194920)