终端设备的控制实验报告
终端设备的控制实验报告
实验目的与要求:
-
加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;
-
通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。
实验过程及数据记录:
- 配置环境文件
- 进入相应的文件夹(目录为:~/oslab/linux-0.11/kernel_drv)
- 修改队列文件read_q(在chr_drv/tty_io.c的末尾添加)
switch_show_char_flag用于判断F12键是否按下。
-
修改串口驱动头文件(include/tty.h)
确保我们需要的功能已初始化。 -
修改键盘键值映射表(kernel_drv/keyboard.S)
F12的扫描码读入队列时,调用相应函数。 -
添加字符“*”显示处理(linux-0.11/kernel_drv/console.c)
从写队列将相应值输出时,进行过滤,把所有数据变成“星号“ -
重新编译内核,make all
- 运行bochs
实验结果分析:
- 串口驱动头文件tty.h,存放并初始化调用需要的变量以及函数名(可执行函数表)。
- 每当按键有动作时,就会进入键盘中断处理程序(keyboard.S是键盘中断处理程序),调用keyboard_interrupt函数(此函数存在于kernelr_drv/keyboard.S)。
- 将读出的按键扫描码存入读队列中(文件read_q用于存放从键盘或串行终端输入的原始字符序列)。
- 存入后,会从读队列中将保存的值取出,再从函数中的key_table表格查询响应函数(这个表决定在扫描代码时调用哪个例程)
- 此时,调用完成,值存入辅助队列secondary和写队列write_q中(tty_io.c是IO设备控制台编译文件,用于存放经过行规则程序处理(过滤)过的数据,或称为熟(cooked)模式数据)。
- 调用console.c文件,进行屏幕显示处理,从 write_q队列中取出字符并显示在屏幕上。
- 重新编译内核,并运行bochs。
实验总结
Q:在原始代码中,按下 F12,中断响应后,中断服务程序会调用 func?它实现的是什么功能?
A:将F12转义成转义字符序列[[L,然后放入读队列中。
Q:在你的实现中,是否把向文件输出的字符也过滤了?如果是,那么怎么能只过滤向终端输出的字符?如果不是,那么怎么能把向文件输出的字符也一并进行过滤?
A:没有把向文件输出的字符过滤,因为更改的是con_write函数,在即将显示在屏幕上时才过滤字符。如果要把向文件输出的字符一并过滤,需要修改file_write函数中输出到文件缓冲区的字符,即写队列需要被更改过滤。
参考文章:
Linux-0.11操作系统实验7-终端设备的控制(https://blog.****.net/weixin_43166958/article/details/104194920)