《操作系统》by李治军 | 实验8 - 终端设备的控制

news/2025/1/16 13:19:19/

目录

一、实验目的

二、实验内容 

三、实验准备

1. 键盘输入处理过程

2. 输出字符的控制

四、实验过程

1. 添加 F12 键盘功能处理

2. 添加  *  字符的显示处理

3. 重新编译内核 

4. 运行 Linux 0.11 

五、实验报告 


一、实验目的

1、加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念。

2、通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。

 

二、实验内容 

       本次实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。

       初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为  。用户再按一次 F12,又恢复正常。第三次按 F12,再次进行输出替换。之后依此类推。

 

以 ls 命令为例

正常情况下输入 ls:

# ls
hello.c hello.o hello

第一次按 F12,然后输入 ls:

# **
*****.* *****.* *****

第二次按 F12,然后输入 ls:

# ls
hello.c hello.o hello

第三次按 F12,然后输入 ls:

# **
*****.* *****.* *****

 

【实验提示】

本次实验需要修改 Linux 0.11 的终端设备处理代码( kernel/chr_drv/console.c 文件),对键盘输入和字符显示进行非常规的控制。  

 

三、实验准备

1. 键盘输入处理过程

键盘 I/O 是典型的中断驱动,在 kernel/chr_drv/console.c 文件中:

void con_init(void)  //控制台的初始化
{// 键盘中断响应函数设为 keyboard_interruptset_trap_gate(0x21, &keyboard_interrupt);
}

每次按键有动作,keyboard_interrupt 函数就会被调用,它在文件 kernel/chr_drv/keyboard.S 中实现(注意,扩展名是大写的 S)。

所有与键盘输入相关的功能都是在此文件中实现的,所以本实验的部分功能也可以在此文件中实现。

简单而言,keyboard_interrupt 被调用后,会将键盘扫描码做为下标,然后去调用数组 key_table 中保存的与该按键对应的响应函数。

 

2. 输出字符的控制

printf() 等输出函数最终都是调用 write() 系统调用,所以控制好 write(),就能控制好输出字符。

 

四、实验过程

建议看看这篇文章理解实验的思路,写的很详细:操作系统实验7-终端设备的控制

 

1. 添加 F12 键盘功能处理

(1)修改 kernel/chr_drv/tty_io.c 文件,在文件末尾添加代码:

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)修改 include/linux/tty.h 文件,在文件末尾添加代码:

extern int switch_show_char_flag;
void press_f12_handle(void);

 

  

(3)修改 kernel/chr_drv/keyboard.S 文件,将 525 行的 func 函数注释掉并换成 press_f12_handle :

/* .long func,none,none,none		58-5B f12 ? ? ? */
.long press_f12_handle,none,none,none

 

2. 添加  *  字符的显示处理

修改 kernel/chr_drv/console.c 文件,修改其中的 con_write 函数:

void con_write(struct tty_struct * tty)
{……case 0:if (c>31 && c<127) {if (x>=video_num_columns) {x -= video_num_columns;pos -= video_size_row;lf();}/* 添加开始 */if (switch_show_char_flag == 1){if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9'))c = '*';}/* 添加结束 */__asm__("movb attr,%%ah\n\t""movw %%ax,%1\n\t"::"a" (c),"m" (*(short *)pos));pos += 2;x++;……}

 

上面的代码就是通过 while 循环一个个地取字符进行处理,然后放入显存。

所以可以在字符放入显存之前进行一次过滤,当 F12_flag == 1 时将字符都转变为

3. 重新编译内核 

// linux-0.11 目录下
make all

4. 运行 Linux 0.11 

进入 Linux 0.11 ,测试结果如下:

 

五、实验报告 

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

【答】按下 F12 后 func 函数实现将 F12 转义成转义字符序列 [ [ L 。(对 F1 ~ F12 处理类似 [ [ A ~ [ [ L)

 

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

【答】本次实验并没有把向文件输出的字符过滤,只是过滤了向终端输出的字符,通过修改 con_write 函数实现。如果要过滤向文件输出的字符,则要修改 file_write 函数来实现。

具体修改可参考:

while (c–>0)
{tmp = get_fs_byte(buf++);if(f12_flag == 1){if((tmp>='A'&&tmp<='Z')||(tmp>='a'&&tmp<='z')||(tmp>='0'&&tmp<='9'))tmp = '*';}*(p++) = tmp;
}

http://www.ppmy.cn/news/628305.html

相关文章

中国网络游戏行业发展模式创新与投资前景调研报告2021-2027年

第1章&#xff1a;行业发展篇 1.1 网络游戏行业发展背景 1.1.1 网络游戏定义与分类 &#xff08;1&#xff09;网络游戏行业定义 1.1.2 网络游戏行业分类 1.1.3 网络游戏行业产业链分析 &#xff08;1&#xff09;网络游戏产业链结构 1&#xff09;游戏开发商 2&#xff09;游戏…

当乐app官方下载android,当乐下载安卓最新版_手机官方版免费安装下载_豌豆荚

程序需要调用以下重要权限&#xff1a; 更新组件使用情况统计 - 允许程序更新组件使用情况统计 请求安装文件包 - 允许程序请求安装文件包 卸载快捷方式 - 允许程序卸载快捷方式 安装快捷方式 - 允许程序安装快捷方式 控制近距离通信 - 允许程序执行NFC近距离通讯操作,用于移动…

http://android.d.cn/ 当乐网不错诶

http://android.d.cn/ 当乐网不错诶 http://android.d.cn/‘’ posted on 2013-01-27 01:36 lexus 阅读( ...) 评论( ...) 编辑 收藏 转载于:https://www.cnblogs.com/lexus/archive/2013/01/27/2878430.html

Docker 私有仓库

一、私有仓库搭建 拉取私有仓库镜像 docker pull registry 启动私有仓库 docker run -id --nameprivate_registry -p 5000:5000 registry 打开浏览器输入 http://私有仓库服务器IP地址:5000/v2/_catalog 修改 daemon.json 文件 sudo gedit /etc/docker/daemon.json 在…

”当乐折扣端“最低3折之安全性是否值得体验?

前言&#xff1a; 现在超过10年的手游分发平台可不多了&#xff0c;超过10年还坚持给玩家最大的福利的平台更少了。 历史&#xff1a; 当乐网自2004年成立&#xff0c;看看2004年有什么&#xff0c;手机还是诺基亚一家独大&#xff0c;大部分玩家可能玩的最多的游戏就是集成在诺…

手游SDK知识详析

一、SDK概念 SDK &#xff0c;即 Software Development Kit&#xff0c;软件开发工具包的意思&#xff0c;通俗点说&#xff0c;就是辅助开发某一类软件的相关文档、范例和工具的集合&#xff0c;不过我们平时所说到的Sdk其实会更加简单一些&#xff0c;就是一个封装了各种功能…

android 银联支付sdk混淆,文档中心

2.3.2 配置activity和Service 2.3.3 初始化SDK 2.3.3.1 获取参数 登录CP后台,获取初始化参数(如何查看参数&#xff1f;)&#xff0c;其中初始化参数中的serverSeqNum为支付回调服务器序列号&#xff0c;该参数需要CP自定义&#xff0c;具体步骤详见 2.3.3.2 调用初始化接口 初…

逆向教程-当乐启动图分析手记

demo-愤怒的小鸟当乐版下载地址&#xff1a; http://pan.baidu.com/s/1ntDnlSt 首先反编译&#xff0c;回编译&#xff0c;然后将apk放到模拟器运行&#xff0c;得到如下画面&#xff1a; 是不是看着很不爽&#xff0c;作为游戏发烧友来说&#xff0c;任何延长游戏启动的画…