0%

操作系统实验四_中断控制

操作系统实验报告

[toc]

实验目的

1、PC系统的中断机制和原理

2、理解操作系统内核对异步事件的处理方法

3、掌握中断处理编程的方法

4、掌握内核中断处理代码组织的设计方法

5、了解查询式I/O控制方式的编程方法

实验要求

1、知道PC系统的中断硬件系统的原理

2、掌握x86汇编语言对时钟中断的响应处理编程方法

3、重写和扩展实验三的的内核程序,增加时钟中断的响应处理和键盘中断响应。

4、编写实验报告,描述实验工作的过程和必要的细节,如截屏或录屏,以证实实验工作的真实性

实验环境

  • Windows 10
  • WSL (Windows Subsystem for Linux) [Ubuntu 18.04.2 LTS]:WSL 是以软件的形式运行在 Windows 下的 Linux 子系统,是近些年微软推出来的新工具,可以在 Windows 系统上原生运行 Linux。
  • gcc version 7.5.0:C 语言程序编译器,Ubuntu 自带。
  • ld version 2.3.0: 链接器,Ubuntu自带
  • NASM version 2.13.02:汇编程序编译器,通过sudo apt install nasm安装在 WSL 上。
  • Oracle VM VirtualBox :轻量开源的虚拟机软件,安装在Windows下。
  • VSCode - Insiders v1.33.0:好用的文本编辑器,有丰富的插件,可以用它来打开WSL中的文件夹,用它自带的终端执行make命令。
  • GNU Make 4.1:安装在 Ubuntu 下,一键编译并连接代码,生成最终的文件。
  • Bochs 2.1.1:安装在Windows下,用于调试代码。

自制工具

​由于我的虚拟机和Bochs都安装在Windows下,所以需要将WSL中生成的文件写入至Windows的磁盘,这可以用我编写的工具 do 来解决,只需要执行

1
./do 文件名 写入的扇区

就可以了。

实验内容

概述

​由于上次实验已经写好了操作系统内核,这次只用在里面修改即可。首先学习x86中断系统,明白时钟中断的原理,然后用时间中断实现”风火轮“,用一个其他中断实现用户程序敲击键盘显示’OUCH!OUCH!’的功能。

设置中断入口点

​为了方便地使用中断,可以编写一个中断服务程序,再修改中断号对应的中断向量表。修改中断向量表的操作对不同中断是相似的,只是中断号和中断服务程序的地址不同而已,我们把这部分内容写成一个宏,放置在entry.asm里,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
%macro set_ivt 2
;第一个参数表示第几号中断,第二个参数表示中断服务程序的位置
push ax
push es
push bx
push si
push dx

xor ax,ax
mov es,ax
mov ax,%1
mov bx,4
xor dx,dx
mul bx;中断号*4后得到中断向量表中对应的地址
mov si,ax
xor dx,dx
mov ax,%2
mov bx,16;把位置除以16,得到偏移量和段地址
div bx
mov word [es:si],dx;前两个字节放偏移量
mov word [es:si+2],ax;后两个字节放段地址

pop dx
pop si
pop bx
pop es
pop ax
%endmacro

编写时钟中断

​x86系统会自动产生时钟中断,为了实现’’风火轮’的效果,我们可以修改中断向量表中0x08号中断对应的内容,让它指向我们编写的中断服务程序。中断服务程序很简单,只用在内存中放置一个变量表示当前是显示’-‘、’\‘还是’/‘即可。但值得注意的是开始时要关中断,返回前要开中断,且要加上

1
2
3
int 0x1c
mov al,20h
out 20h,al

​这几行代码,没有这些代码会出现莫名其妙的错误,一直找不到原因。

​写完之后,在内核入口处加上一句:

1
set_ivt 8h,_int_8h

​就可以修改中断向量表了。

编写 33号中断

​编写33号中断以实现在屏幕下方显示”OUCH!OUCH!”的功能,然后在用户程序中每次敲击键盘时调用33号中断。判断用户是否敲击键盘,只用调用0x16号中断即可,如下所示:

1
2
3
int 16h
jz do
int 33

同样,写完之后加上一句:

1
set_ivt 33,_int_33

​就可以运行了。

实验过程

​编写一个makefile文件,然后就可以在VSCode自带的终端里输入make完成大量的工作。这次的makefile与上次没有任何区别,不再赘述。

​用bochs运行,可以看到风火轮的效果:
image-20200529153811786.png

image-20200529153848248.png

​进入用户程序,敲击键盘:

image-20200529153920257.png

​可以看到显示了 ‘OUCH!OUCH!’,并且风火轮还在转动。

​提交的文件夹中还附带了一个录屏视频,可以查看。

实验总结

​在完成这次实验过程中遇到的主要困难有:

  1. 编写完0x08号中断后,操作系统运行的时候经常莫名其妙地卡住,无法正常运行。找了半天我也没想明白问题出在哪。于是我只好把BIOS的0x08号中断 “扣” 出来,然后在它上面进行修改,然后就能正常运行了。

  2. 本来是打算在显示 “OUCH!OUCH!” 的时候顺便显示系统的时间的,但BOCHS的时间系统似乎比正常的要快很多,导致完全无法显示正常的时间,而用Virtual Box又无法正常执行,于是只能把那一段代码删掉。

    ​总的来说,这次实验算比较简单了,只需要将原有的操作系统内核稍作修改即可。但又十分重要,毕竟操作系统的很多内容都要靠时钟中断来完成。我对这些内容掌握的还不够扎实,以后还要加强。