当前位置: 首页 > news >正文

【哈工大_操作系统实验】Lab8 终端设备的控制

本节将更新哈工大《操作系统》课程第八个 Lab 实验 终端设备的控制。按照实验书要求,介绍了非常详细的实验操作流程,并提供了超级无敌详细的代码注释

实验目的:

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

实验任务:

本实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。
在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为*。用户再按一次 F12,又恢复正常。第三次按F12,再进行输出替换。依此类推。

文件名介绍
hit-操作系统实验指导书.pdf哈工大OS实验指导书
Linux内核完全注释(修正版v3.0).pdf赵博士对Linux v0.11 OS进行了详细全面的注释和说明
file1615.pdfBIOS 涉及的中断数据手册
hit-oslab-linux-20110823.tar.gzhit-oslab 实验环境
gcc-3.4-ubuntu.tar.gzLinux v0.11 所使用的编译器
Bochs 汇编级调试指令bochs 基本调试指令大全
最全ASCII码对照表0-255屏幕输出字符对照的 ASCII 码
x86_64 常用寄存器大全x86_64 常用寄存器大全

一、键盘输入处理

键盘中断发生步骤:

  1. 键盘 I/O 是典型的中断驱动,在 kernel/chr_drv/console.c 文件中将键盘中断响应函数设为 keyboard_interrupt。每次按键有动作,keyboard_interrupt 函数就会被调用,函数定义在文件 kernel/chr_drv/keyboard.S中;
  2. 根据扫描码,查 key_table 表进行扫描码处理,表中定义了相关所有扫描码对应键的处理函数,比如f1-f12键的处理则要先运行一段处理函数func
  3. 将扫描码放到键盘输入队列中,调用do_tty_interrupt函数进行处理。

为了实现按F12实现切换,只需要定义一个切换函数,并将其放在ket_tableF12对应的处理函数位置即可。

1、修改文件linux-0.11/kernel/chr_drv/tty_io.c,定义标志位,实现每按下一次F12标志位就会变化。

int switch_show_char_flag = 0;
void press_F12_handle(void)
{switch_show_char_flag = switch_show_char_flag ? 0 : 1;
}

2、修改linux-0.11/include/linux/tty.h文件,将标志位和函数声明为全局。

extern int switch_show_char_flag;
void press_F12_handle(void);

3、修改linux-0.11/kernel/chr_drv/keyboard.S文件中key_tableF12对应的处理函数。

key_table:/* .long func,none,none,none         58-5B f12 ? ? ? */.long press_F12_handle,none,none,none /* 58-5B f12 ? ? ? */

二、屏幕输出控制

屏幕输出过程:

  1. 输出字符到屏幕,系统调用write函数来进行;
  2. write函数则会调用sys_write系统调用来实现字符输出;
  3. 然后再调用tty_write函数;
  4. 最终调用con_write函数将字符输出。

故只需要修改con_write最终写到显存中的字符就可以了。具体修改文件linux-0.11/kernel/chr_drv/console.c,修改如下:

void con_write(struct tty_struct * tty)
{
//  ....switch(state) {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) {if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9'))c = '*';}

三、编译并运行

1、编译并运行

cd oslab_Lab7/linux-0.11
make all
../run

2、测试结果

在 Bochs 中进行测试:

  • 若没有按下F12,输出为正常显示;
  • 若按下F12,则数字和字母的回显变为*
  • 且再次按下F12,显示将恢复正常。
    在这里插入图片描述

http://www.mrgr.cn/news/57224.html

相关文章:

  • python程序设计员—练习笔记
  • vue3.0 + vite打包完成后,将dist下的资源包打包成zip
  • FPGA实现UDP通信(5)——CRC校验
  • UVM初学篇 -(22)UVM field_automation 域的自动化机制
  • Redis遇到Hash冲突怎么办?
  • 将本地文件上传到GIT上
  • 买华为系的车,这个理由无法拒绝
  • hass docker openwrt配置
  • 软件分享丨PDF Shaper
  • 不错的二次元个人导航页源码
  • 从新手到高手:map和set的使用技巧全攻略(C++)
  • 重学SpringBoot3-集成Hazelcast
  • 微服务-nacos
  • 掘金.计算位置 x 到 y 的最少步数(简单01)
  • 面试总结分享:25道数据库测试题
  • Vue01
  • leetcode hot100【LeetCode 49. 字母异位词分组】java实现
  • ScheduledThreadPoolExecutor的源码剖析
  • Visual Studio2022 Profile 工具使用
  • netty之ChannelPipeline和ChannelHandler
  • 【网络】HTTP协议(下)
  • 深信服超融合HCI6.8.0R2滚动热升级至HCI6.9.1
  • 京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?
  • 列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换
  • JavaScript(操作元素属性:样式style,className,classList,表单元素,自定义属性,间歇函数)注册用户协议同意倒计时
  • 【C++篇】探索STL之美:熟悉使用String类