操作系统实验报告
[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 | %macro set_ivt 2 |
编写时钟中断
x86系统会自动产生时钟中断,为了实现’’风火轮’的效果,我们可以修改中断向量表中0x08号中断对应的内容,让它指向我们编写的中断服务程序。中断服务程序很简单,只用在内存中放置一个变量表示当前是显示’-‘、’\‘还是’/‘即可。但值得注意的是开始时要关中断,返回前要开中断,且要加上
1 | int 0x1c |
这几行代码,没有这些代码会出现莫名其妙的错误,一直找不到原因。
写完之后,在内核入口处加上一句:
1 | set_ivt 8h,_int_8h |
就可以修改中断向量表了。
编写 33号中断
编写33号中断以实现在屏幕下方显示”OUCH!OUCH!”的功能,然后在用户程序中每次敲击键盘时调用33号中断。判断用户是否敲击键盘,只用调用0x16号中断即可,如下所示:
1 | int 16h |
同样,写完之后加上一句:
1 | set_ivt 33,_int_33 |
就可以运行了。
实验过程
编写一个makefile文件,然后就可以在VSCode自带的终端里输入make完成大量的工作。这次的makefile与上次没有任何区别,不再赘述。
用bochs运行,可以看到风火轮的效果:
进入用户程序,敲击键盘:
可以看到显示了 ‘OUCH!OUCH!’,并且风火轮还在转动。
提交的文件夹中还附带了一个录屏视频,可以查看。
实验总结
在完成这次实验过程中遇到的主要困难有:
编写完0x08号中断后,操作系统运行的时候经常莫名其妙地卡住,无法正常运行。找了半天我也没想明白问题出在哪。于是我只好把BIOS的0x08号中断 “扣” 出来,然后在它上面进行修改,然后就能正常运行了。
本来是打算在显示 “OUCH!OUCH!” 的时候顺便显示系统的时间的,但BOCHS的时间系统似乎比正常的要快很多,导致完全无法显示正常的时间,而用Virtual Box又无法正常执行,于是只能把那一段代码删掉。
总的来说,这次实验算比较简单了,只需要将原有的操作系统内核稍作修改即可。但又十分重要,毕竟操作系统的很多内容都要靠时钟中断来完成。我对这些内容掌握的还不够扎实,以后还要加强。