哈工大OS实验八---按下F12让输出变成*号(终端设备的控制)

终端设备的控制

参考至

原文链接: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 = ‘*’;

这样就完成了,看一下效果

哈工大OS实验八---按下F12让输出变成*号(终端设备的控制)_第1张图片

你可能感兴趣的:(哈工大OS实验八---按下F12让输出变成*号(终端设备的控制))