通过中断控制终端设备

一、视频学习

L26 I/O 与显示器

在这里插入图片描述
让设备工作起来:

  1. 形成文件视图
  2. 发出out指令
  3. 形成中断处理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
int dup(int oldfd);功能: 复制一个描述符(创建一个新描述符,它与原有描述符指向相同的文件、管道或网络连接)。该函数在创建新的文件描述符时,将值最小的未被使用的描述符分配给新的描述符。

在这里插入图片描述
在这里插入图片描述
接下来要开始做处理函数

在这里插入图片描述
显示器是用来写的,键盘是用来读的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

L27 键盘

用户按下键盘按键就会向CPU发出中断
在这里插入图片描述
outb:输出一个字节

inb:读入一个字节

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
让设备工作起来:

  1. 形成文件视图
  2. 发出out指令
  3. 形成中断处理

二、实验

代码修改参考:https://blog.csdn.net/weixin_43166958/article/details/104194920

正如视频课中李治军老师所说,无非做了两件事情:

  1. 添加F12功能键盘处理

    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;
    	}
    }
    

    在相关头文件中完成声明

  2. 添加字符 * 显示处理。在执行函数tty_write的时候,让c=‘*’,然后写入write_q队列中,就可以将你printf输出的东西全部变成 *

    if (switch_show_char_flag == 1)
      				{
      					if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9'))
      						c = '*';
      				}
    

最后编译内核,运行虚拟机,运行结果:

在这里插入图片描述

体会:这个过程看起来很复杂,但是听了李治军老师的课程后,感觉思路特别的清晰,也没有想象中的那么复杂了,仅作两处修改便可完成实验。

三、问答

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

​ 实现变量 switch_show_char_flag 的值在0和1之间的切换,0代表在终端正常输出,1代表在终端输出的所有字母都替换为“*”

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

​ 没有把向文件输出的字符过滤,只过滤了向终端输出的字符是通过con_write函数(con表示console控制台的意识,即终端)的修改来实现的。过滤向文件输出的字符则通过修改file_write函数来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值