1、实验相关知识阐述:
本实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。 printf() 等输出函数最终都是调用 write() 系统调用,所以控制好 write(),就能控制好输出字符。
2、实验原理的预习情况:
回答问题:
在原始代码中,按下 F12,中断响应后,中断服务程序会调用 func?它实现的是什么功能?
答:正常情况下打开模拟器中,按下功能键F12即可显示内核栈中各个进程的状态信息,而当把func中的call show_stat屏蔽掉后,再按下F12就什么也没有了,可见func实现的功能就是调用show_stat函数来显示内核栈中各个进程的状态信息。
在你的实现中,是否把向文件输出的字符也过滤了?如果是,那么怎么能只过滤向终端输出的字符?如果不是,那么怎么能把向文件输出的字符也一并进行过滤?
答:只过滤了向终端输出的字符,向文件输出的字符没有被过滤。因为我们最后修改的是控制向显存输出的con_write()函数,使其当flag=1的时候向显存输出星号。如果要过滤掉向文件输出的字符的话,需要找到对应的那个控制向文件输出的函数并修改。
3、实验注意事项:
本实验需要修改 Linux 0.11 的终端设备处理代码(kernel/chr_drv/console.c 文件),对键盘输入和字符显示进行非常规的控制。
实验目的
加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;
通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。
实验原理
键盘 I/O 是典型的中断驱动,在 kernel/chr_drv/console.c 文件中:
void con_init(void) //控制台的初始化
{
// 键盘中断响应函数设为 keyboard_interrupt
set_trap_gate(0x21, &keyboard_interrupt);
}
copy
cd oslab
tar -zxvf hit-oslab-linux-20110823.tar.gz -C /home/shiyanlou
copy
func:
push %eax
push %ecx
push %edx
//call show_stat
pop %edx
pop %ecx
pop %eax
copy
int flag = 0;
int f1=0,f2=0,f3=0;
copy
copy_to_cooked函数添加如下:
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
extern int flag;
copy
//添加开始
if(flag == 1){
c = '*';
}
//添加结束
__asm__("movb attr,%%ah\n\t"
"movw %%ax,%1\n\t"
::"a" (c),"m" (*(short *)pos)
);
copy
学习时间 64分钟
操作时间 33分钟
按键次数 186次
实验次数 3次
报告字数 3506字
是否完成 完成