操作系统实验7:终端设备字符显示的控制

news2024/9/26 3:28:02

实验目的

  1. 加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念;
  2. 通过实践掌握Linux 0.11对键盘终端和显示器终端的处理过程。

实验内容

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

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

以ls命令为例:

正常情况:

ls
hello.c hello.o hello

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

 **
*****.* *****.* *****

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

ls
hello.c hello.o hello

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

**
*****.* *****.* *****

实验过程

要完成这个实验,要清楚两点,第一是键盘输入是如何处理的,第二点是信息是怎么显示到显示器上的,详细的过程可以看李治军老师的书《操作系统原理、实现与实践》中的第8章。

键盘输入处理

键盘I/O是典型的中断驱动,所以这个过程是从中断开始的,当然这里指的是按下按键之后。以scanf()函数为例,整个过程如下:

keyboard_interrupt ---> inb 0x60,al ---> do_self ---> read_q ---> copy_to_cooked ---> secondary --->
wake_up ---> tty_read ---> rw_ttyx ---> rw_char ---> sys_read ---> read ---> scanf.

当然并不是所有按键都调用do_self函数进行处理,对于F12按键,其调用的函数是func,因此要对该函数进行修改或者重写,目的就是要在按下F12的时候进行标记。

信息显示过程

以调用printf()函数为例,打印到显示器信息需要经历下面的过程:

printf ---> write ---> sys_write ---> rw_char ---> rw_ttyx --- > tty_write ---> wtite_q --->
 con_write ---> "mov ax,[pos]"

上面的过程中,con_write函数是真正的写函数,因此需要在此之前修改显示的内容,可以在写write_q队列的时候进行修改。

结合上面的两个过程,总结起来要修改两个地方,一是按键处理,二是显示处理。

修改F12按键的处理函数

在`kernel/chr_drv/keyboard.S文件中找到key_table数组,在其中找到F12对应的处理函数,如下图所示:
在这里插入图片描述
由于func函数对应多个按键,因此这里将F12按键对应的处理函数改称myfunc,然后实现myfunc函数,这里函数里主要是标记F12是否按下。

F12按键处理函数的实现

处理函数的实现很简单,仅仅只是标记F12是否按下。为了方便(其实是偷懒),将这个函数放到已有的c文件中,这里我把它放到console.c文件中,同时定义一个全局变量,用于标记F12的状态。代码如下:

int f12_flag = 0;

extern void myfunc(void);

void myfunc(void)
{
	if(f12_flag)
		f12_flag = 0;
	else
		f12_flag = 1;
}

显示处理

上面已经标记了按键状态,则显示的时候只需要根据全局变量的值进行相应的显示就可以了。这里在写write_q队列的时候进行修改,即在con_write函数中修改,该函数在kernel/chr_drv/tty_io.c文件中,修改如下:
在这里插入图片描述

验证

编译然后运行,测试结果如下:(注意,笔记本可能需要按Fn + F12)
在这里插入图片描述
可以发现,在第二次按下之后,可以恢复显示,为了能够更清楚的显示,可以保留原来的换行,即不替换换行,代码如下:

/* 新增代码 */
if(f12_flag && c != '\n')
	c = '*';   //按下一次f12后,所有的字符都变成 '*'

在这里插入图片描述
只要弄清楚了键盘中断处理过程和显示过程,这个实验就非常简单了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022-我的年终总结

去年年末,我也写了一篇年终总结。去年这一年是极度繁忙的一年,因各种原因,过年没回家,一个人在宿舍度过了凄凉的春节。而今年是丰收的一年,去年所付出的一切都在今年获得了回报,我也迎来新的生活。 新的生活…

过年春联不可少,python带你制作春联,体验不一样的过年氛围

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 每逢春节,无论城市还是农村, 家家户户都要挑漂亮的红春联贴于门上,辞旧迎新,增加喜庆的节日气氛。 据说这一习俗起于宋代,在明代开始盛…

我是阿豪我的2022年年终总结.

时光如白驹过隙般,飞逝而过,来不及细品岁月的美好。一晃,2022年就过去了! 明天新的一年就来了。回忆一下2022一年都干了什么。 3月份背了大概200多道的前端面试题,疯狂的刷面试题,一天不刷几道面试题心里…

ffmpeg从某站提取视频、音频、详解

ffmpeg从某站提取视频、音频、详解 事件背景 准备链接 第一步安装下载 ffmpeg是开源软件,安装网址http://ffmpeg.org/download.html#build-windows 本人用的windows10系统 打开网址后随便你怎么下载都行,Git、或者直接下等等 按图片输入上述网址也…

【攻防世界】Web very_easy_sql

做了web才发现,原来自己是真的什么都不懂啊,不过也好,说明我有很大的进步空间呢 不闲聊了,来看题目 打开是一个登录界面,我们抓包看看返回些什么 返回包有三个需要注意的地方,我都用框框圈起来了 有一个S…

【C++】map 与 set 的介绍与使用、力扣:692. 前K个高频单词

目录 一、关联式容器 二、键值对 三、set 3.1 set 的介绍 3.2 set 的使用 3.3. set 的使用举例 四、map 4.1 map的介绍 3.2 map 的使用 4.3 map的使用举例 五、经典练习题 1.set的使用 2.map的使用 思路一(稳定排序): 思路二(priority_queue)&#x…

jvm参数说明

-Xmx3550m:设置JVM最大堆内存为3550M。 -Xms3550m:设置JVM初始堆内存为3550M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 -Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M,之…

新式 AIMD 拥塞控制

周三晚上发了一则朋友圈,今天整理一下: ​ AIMD 过程可推导出 TCP 吞吐公式: TaRTTbpT\dfrac{a}{RTT}\dfrac{b}{\sqrt{p}}TRTTa​p​b​ a,b 分别为与 AIMD 参数和过程有关,该公式结论内置公平性。设 MSS 1460&…

【MySQL】九,MySQL逻辑架构剖析

服务器处理客户端请求 Connectors 外部的各种类型的连接客户端。 第一层:连接层 客户端访问 MySQL 服务器前,首先要建立 TCP 连接。 经过三次握手成功建立连接后,MySQL对传输过来的账号密码做身份认证、权限获取。 如果用户名密码错误&am…

【Iava】抽象类和接口

祝早日驱散阴霾 文章目录1. 抽象类1.1 抽象类的概念1.2 抽象类的使用注意事项1.3 抽象类的作用2. 接口2.1 接口的定义2.2 接口的使用规则2.3 创建对象拷贝,实现Cloneable3. 抽象类和接口的区别1. 抽象类 1.1 抽象类的概念 抽象类,顾名思义,这是不是一个具体的类,没有实际的功…

四旋翼无人机学习第17节--封装上传github与gitee

0 前言 经过一段时间的绘制,终于绘制完项目所需的封装。为了更好的管理封装,我准备把封装与焊盘上传到github与gitee,方便之后的管理工作。 1 文件上传gitee 注册这里就不作介绍咯。 1、首先点击新建仓库。 2、设置仓库的名称与项目介绍&…

GO语言初始化数据结构的方法你知道吗?

xdm 我是阿兵云原生 使用 golang 进行编码过程中,你们都是如何初始化数据结构的呢 GO 里面提供了 2 个关键字来进行初始化数据结构 newmake 不过有时候我也会直接使用花括号的方式直接就初始化,例如这样: name : []string{"xiaomot…

电源PCB布局要点

本次已常用的集成电源IC芯片TPS 5430.讲解一下布局要求。 在手册中可以看到官方已给出的详细布局。 这是我们原理图设计的TPS 5430。 通过以上了解到了连接关系以及布局要求。那么我们再看看官方要求是如何硬性要求布局的。 总结: 1.输入电容要靠近Vin 管脚 2.电…

图像简单运算

图像运算是以图像为单位对图像进行数学操作,运算对象以像素点为基本单位,运算结果为一幅灰度分布与原图像不同的新图像。 算术运算与逻辑运算 算术运算与逻辑运算中每次只涉及一个空间像素的位置,所以可以”原地操作“(在&#xf…

【微服务笔记02】微服务组件之Eureka常见的几个配置属性及其常见的几个概念

这篇文章,主要介绍微服务组件中Eureka常见的几个配置属性及其常见的几个概念【源代码地址】。 目录 一、Eureka常见配置属性 1.1、instance配置项 1.2、client配置项 1.3、server配置项 二、eureka常见概念 2.1、服务注册 2.2、服务发现 2.3、服务续约 2.4…

CSS常见标签知识回顾

学前端的一点css笔记,参考的是黑马程序员pink老师的教程。 一.行内元素 1.一行可以显示多个 2.宽度核高度默认由内容撑开 3.不可以设置宽高 代表标签: a、span、b、ui、s、strong、ins、em、del 二、行内块元素 1.一行可以显示多个 2.可以设置宽高…

回顾2022年总结

文章目录前言这一年感悟感想成绩新的一年期许前言 2022过的好快,接着我对自己这一年的所做的事情来进行一个汇总和感悟感想总结! 所有博客文件目录索引:博客目录索引(持续更新) 这一年 月份做了什么事1转本备考、Java技术(netty一套课程、…

VisionMaster应用实例——识别锁付孔位

项目背景:相机对法兰盘表面进行拍照,获取法兰盘上16个孔位的位置,通过VisionMaster进行TCP通信,将位置信息发送给机械臂,对这16孔位的螺丝进行拧紧,同时需要根据十字锁付的特点。 思路分析: 1.方…

[oeasy]python0036_牛说_cowsay_小动物说话_asciiart_figlet_lolcat_管道(祝大家新年快乐~)

牛说(cowsay) 回忆上次内容 上次我们研究了shell脚本的编程 并且在shell中实现了 循环语句延迟命令清屏命令python命令figlet命令还能整点什么呢?🤔还想要让小动物报时 cowsay 首先要安装 cowsay sudo apt install cowsay 装完之后 cow 就可以 say 了…

人工智能-逻辑回归

1,逻辑回归介绍 逻辑回归:分类模型 应用场景:广告点击率、是否垃圾邮件 逻辑回归主要用于解决二分类问题 输入: 逻辑回归的输入:线性回归的结果 激活函数:sigmoid函数 回归的结果输入到sigmoid函数中 输…