终端设备的控制
参考至
原文链接:https://blog.csdn.net/qq_41708792/article/details/91040147
实验目的
- 加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;
- 通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。
实验内容
本实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。
在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为“*”。用户再按一次 F12,又恢复正常。第三次按 F12,再进行输出替换。依此类推。
实现思路
我们先简单介绍一下操作系统是如何使键盘工作的
键盘作为一个写入设备,键盘的每一次敲击就是一次中断,中断号为0x21
,当键盘引起中断后,调用keyboard_interrupt
函数,在该函数中,操作系统会根据扫描码(键盘的按键)从key_table中找到对应的处理函数,处理函数会找到键盘按键对应的ASCLL码,然后将其放入read_q
队列中,等待CPU读取,详细的代码可以看这篇博客CPU如何读取键盘传过来的数据
在这个例子中,F12
按键的对应函数就是func
,我们要做的就是修改这个func
函数
在kernel/chr_drv/keyboard.S
文件中
//在func函数下添加以下代码
pushl %eax
pushl %ecx
pushl %edx
call change_F12_Flag
popl %edx
popl %ecx
popl %eax
在kernel/chr_drv/console.c
//添加全局变量int F12_Flag
int F12_Flag = 0; //0表示显示原来的,1表示显示*号
//实现change_F12_flag函数
void change_F12_flag(void)
{
if(F12_Flag==0)
F12_Flag=1;
else
F12_Flag=0;
}
修改con_write函数
在这个里面可以看到一段关键代码、
__asm__("movb attr,%%ah\n\t"
"movw %%ax,%1\n\t"
::"a" (c),"m" (*(short *)pos)
);
这段代码就是将字符写入显存中,现在在这段代码前面加上一行代码
if(F12_Flag == 1 && ( (c >= 48 && c<= 57) || (c>=65 && c<=90) || (c>=97 && c<=122) ) )
c = '*';
这样就完成了,看一下效果
| (c>=97 && c<=122) ) )
c = ‘*’;
这样就完成了,看一下效果