操作系统实验(6:字符显示的控制)

实验目的

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

实验内容

本实验的基本内容就是修改Linux 0.11的终端设备处理代码,掌握如何能对键盘处理和字符显示进行适当的控制,主要包括如下三个基本任务:

  1. 创建一个显示状态DisplayState,通过键盘的某个按键来修改这个状态信息,本实验假定用F12来控制该状态,即如果DisplayState=0,则按键F12会将其改变为1;而如果DisplayState=1,则按键F12会将其改变为0。
  2. 根据显示状态DisplayState决定了字符如何显示,此处用0或1的DisplayState来控制字符的回显,即如果DisplayState=0,字符正常回显;而如果DisplayState=1,任何字符都用*回显。
  3. 在此基础上再用DisplayState控制非回显到屏幕(通常就是printf,printf再调用write(1)输出到屏幕上的)上字符。

实验步骤

实验步骤参考博客https://blog.csdn.net/m0_38099380/article/details/89221596
(侵删)

1. 编写press_f12_handle函数

进入linux-0.11/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. 修改tty_table

打开keyboard.S,修改代码如下:

.long press_f12_handle,none,none,none

在这里插入图片描述

3. 修改con_write

打开console.c,在con_write函数中添加如下代码:

if (switch_show_char_flag == 1)
{
	c = '*';
}

在这里插入图片描述

4. 修改tty.h

进入include/linux目录,打开tty.h,添加如下代码:

extern int switch_show_char_flag;
void press_f12_handle(void);

在这里插入图片描述

5. 编译linux,运行bochs,试验按下法f12,得到结果如图:

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用汇编语言编写的 8259 中断控制实验程序,同时实现了中断次数的显示: ```assembly section .data count db 0 ; 定义计数器 section .text handler: pusha ; 保存通用寄存器 inc byte [count] ; 每次中断,计数器加一 mov al, 0x20 out 0x20, al ; 发送中断结束命令 popa ; 恢复通用寄存器 iret ; 中断返回指令 global _start _start: ; 初始化主片和从片 mov al, 0x11 ; ICW1: 边沿触发模式,级联8259,需要ICW4 out 0x20, al ; 主片ICW1 out 0xa0, al ; 从片ICW1 mov al, 0x20 ; ICW2: 设置主片中断向量号为0x20~0x27 out 0x21, al ; 主片ICW2 mov al, 0x28 ; ICW2: 设置从片中断向量号为0x28~0x2f out 0xa1, al ; 从片ICW2 mov al, 0x04 ; ICW3: 设置从片连接到主片的IR2 out 0x21, al ; 主片ICW3 mov al, 0x02 ; ICW4: 8086模式 out 0x21, al ; 主片ICW4 out 0xa1, al ; 从片ICW4 ; 设置中断向量表 mov al, 0x08 mov ah, 0x35 mov dx, handler int 0x21 ; 开启中断 sti ; 循环显示计数器 loop: mov al, byte [count] call print_num call print_nl jmp loop print_num: ; 将数字转为字符串 push ax push bx push cx push dx xor bx, bx mov cx, 10 div cx add ax, 0x3030 mov byte [num_str+1], al mov byte [num_str], ah mov ah, 0x09 mov dx, num_str int 0x21 pop dx pop cx pop bx pop ax ret print_nl: ; 输出换行符 mov ah, 0x02 mov dl, 0x0a int 0x21 mov dl, 0x0d int 0x21 ret section .bss num_str resb 2 ; 存储数字字符串的缓冲区 ``` 在中断服务程序 `handler` 中,每次中断时计数器 `count` 加一,并发送中断结束命令。在 `_start` 函数中,先初始化 8259 芯片,然后设置中断向量表、开启中断,并通过一个无限循环不断显示计数器的值,同时调用 `print_num` 函数将数字转为字符串并输出,再调用 `print_nl` 函数输出换行符,以避免过于频繁的输出。 需要注意的是,在实际的应用场景中,8259 芯片可能已经被 BIOS 或操作系统初始化,这时需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值