“操作系统实验”实验报告

终端设备的控制

实验名称:终端设备的控制

实验日期:2022年5月27日

班级:软嵌201 姓名:邓浩礼 学号:2030110734

一、实验目的

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

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

二、实验环境

本操作系统实验的硬件环境是 IA-32(x86) 架构的 PC 机(在实验楼的环境中就是右侧的窗口),主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码。

三、实验内容

本实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。

在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为“*”。用户再按一次 F12,又恢复正常。第三次按 F12,再进行输出替换。依此类推。

以 ls 命令为例:

正常情况:

ls

hello.c hello.o hello

第一次按 F12,然后输入 ls:

**

*.* *.* *****

第二次按 F12,然后输入 ls:

ls

hello.c hello.o hello

第三次按 F12,然后输入 ls:

**

*.* *.* *****

四、实验过程及数据记录

环境准备

图片描述

修改 linux-0.11/kernel/chr_drv/keyboard.S 文件,正常情况下在 linux0.11 中,当按下 F1~F12 的功能键后会调用 show_stat 函数来显示系统中当前进程状态,对应代码在 kernel/chr_drv/keyboard.S 文件中的 func 函数

将语句 call show_stat 删除掉,因为我们不需要原有的 F12 所对应的按键功能。

图片描述

修改 tty_io.c 文件,该文件中的 copy_to_cooked 函数是处理 ASCII 字符的函数。先在该函数的定义外面增加全局变量如下, flag 即开关标志, f1~f3 是等会判断要用到的一些中间变量。

图片描述

然后在 copy_to_cooked 函数中添加一部分内容,使其识别到 F12 对应的那四个 ASCII 字符后( F12 这个功能键的扫描码是 ESC、[、[、L ,它们对应的 ASCII 码是 27,91,91,76 ),改变 flag 的值,然后 continue 跳过本轮循环(否则会继续执行后面的代码从而导致按下 F12 时会显示一个字符 L )

图片描述

修改 console.c 文件 在( kernel/chr_drv/console.c )文件中定义的 con_write() 函数中,它对队列中的字符进行了一些处理后,最终放入显存。所以我们只需要在这段代码之前加上一条if语句,判断 flag 如果是 1 ,则把要放入显存中的字符变成星号,修改后如下(需要在该函数中先通过 extern int flag 这条语句来声明外部变量 ,因为 flag 在现在的这个文件中还没有定义过)

图片描述

运行验证

图片描述

图片描述

五、实验分析

在原始代码中,按下 F12,中断响应后,中断服务程序会调用 func?它实现的是什么功能?

回答:

正常情况下打开模拟器中,按下功能键F12即可显示内核栈中各个进程的状态信息,而当把func中的call show_stat屏蔽掉后,再按下F12就什么也没有了,可见func实现的功能就是调用show_stat函数来显示内核栈中各个进程的状态信息。

在你的实现中,是否把向文件输出的字符也过滤了?如果是,那么怎么能只过滤向终端输出的字符?如果不是,那么怎么能把向文件输出的字符也一并进行过滤?

回答:

只过滤了向终端输出的字符,向文件输出的字符没有被过滤。 因为我们最后修改的是控制向显存输出的con_write()函数,使其当flag=1的时候向显存输出星号。 如果要过滤掉向文件输出的字符的话,需要找到对应的那个控制向文件输出的函数并修改。

最新评论
暂无评论~