一、视频学习
L26 I/O 与显示器
让设备工作起来:
- 形成文件视图
- 发出out指令
- 形成中断处理
int dup(int oldfd);
功能: 复制一个描述符(创建一个新描述符,它与原有描述符指向相同的文件、管道或网络连接)。该函数在创建新的文件描述符时,将值最小的未被使用的描述符分配给新的描述符。
接下来要开始做处理函数
显示器是用来写的,键盘是用来读的
L27 键盘
用户按下键盘按键就会向CPU发出中断
outb:输出一个字节
inb:读入一个字节
让设备工作起来:
- 形成文件视图
- 发出out指令
- 形成中断处理
二、实验
代码修改参考:https://blog.csdn.net/weixin_43166958/article/details/104194920
正如视频课中李治军老师所说,无非做了两件事情:
-
添加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; } }
在相关头文件中完成声明
-
添加字符 * 显示处理。在执行函数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函数来实现。