实验名称:终端设备的控制
实验日期: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设备管理有了一些认识,进一步了解了键到了盘中断、扫描码等概念。
学习时间 32分钟
操作时间 24分钟
按键次数 135次
实验次数 6次
报告字数 3436字
是否完成 完成