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

终端设备的控制

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

实验日期:7.8

班级:物联网194

姓名:舒文杰

学号:1930110734

一、实验目的

加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念; 通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。

二、实验环境

1、硬件环境是 IA-32(x86) 架构的 PC 机(在实验楼的环境中就是右侧的窗口)

2、主要软件环境是 Bochs + gcc + 你最喜欢的编辑器 / IDE + 你最喜欢的操作系统 + Linux 0.11 源代码

三、实验内容

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

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

以 ls 命令为例:

正常情况:

# ls
hello.c hello.o hello
copy
copy

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

# **
*****.* *****.* *****
copy
copy

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

# ls
hello.c hello.o hello
copy
copy

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

# **
*****.* *****.* *****
copy

四、实验过程及数据记录

1.解压:

cd ~/oslab
tar  -zxvf hit-oslab-linux-20110823.tar.gz  -C  /home/shiyanlou
copy

图片描述

2.修改/kernel/chr_drv/keyboard.S 删除call show_state. 图片描述

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

void copy_to_cooked(struct tty_struct * tty)
{
signed char c;
while (!EMPTY(tty->read_q) && !FULL(tty->secondary)) {
GETCH(tty->read_q,c);
//开始添加

if(c==27){
f1 = 1;
f2=f3=0;
}
else if(f1==1 && f2==0 && c==91){
f2 = 1;
}
else if(f2==1 && f3==0 && c==91){
f3 = 1;
}
else if(f3==1 && c==76 && flag==0){
flag = 1;
f1=f2=f3=0;
continue;
}
else if(f3==1 && c==76 && flag==1){
flag = 0;
f1=f2=f3=0;
continue;
}
else{
f1=f2=f3=0;
}
}
//添加结束
}
copy

图片描述

int switch_show_char_flag = 0;
void press_f12_handle(void)
{
    if (switch_show_char_flag == 0)
    {
        switch_show_char_flag = 1;
    }
    else if (switch_show_char_flag == 1)
    {
        switch_show_char_flag = 0;
    }
}
copy

图片描述

4修改/include/linux/tty.h文件,在末尾添加:

extern int switch_show_char_flag;
void press_f12_handle(void);
copy

图片描述

5.修改kernel/chr_drv/keyboard.S文件,修改key_table代码如下:

/* .long func,none,none,none        58-5B f12 ? ? ? */
.long press_f12_handle,none,none,none
copy

图片描述

为了实现按下F12键,文字变为“”的功能,我们修改/kernel/chr_drv/console.c中的con_write()函数,添加if语句,注意添加声明

if(flag == 1){
c = '*';
}
copy

图片描述

6.所有修改完成后,编译内核

图片描述

7.在进入系统后,输入ls -l发现字符正常显示,此时再输入F12然后输入ls -l命令,发现所有的字符回显均变成了*号,实验结果符合预期。

图片描述

五、实验结果分析

修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为“*”。实验成功

六、实验心得

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

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

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

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

本次实验修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。对linux设备管理有了一些认识,进一步了解了键到了盘中断、扫描码等概念。

最新评论
暂无评论~