30天自制操作系统第六天

操作系统实验日志6

第6天:分割编译与中断处理

一、实验主要内容

1、 内容1: 分割源文件

将源文件bootpack.c分为graphic.c(关于描画的处理)、dsctbic.c(关于GDT、IDT等处理)、bootpack.c(其他处理)三个文件,注意事项:

①但凡是用到naskfunc.nas中的函数的文件,都应该在开始的时候进行函数声明;

②要在Makefile文件中加入新文件的生成信息;

这样做的优缺点:

在这里插入图片描述

2、 内容2:整理Makefile

将Makefile中具有相同结构的命令行采用类似通配符的方法整理归纳,例如:

在这里插入图片描述

在这个规则中,依赖关系中的名字用%来代替,其通配符的使用和linux中相同,*代表任意字符,?代表任意一个字符,[…]指定某个字符,如果用通配符的写法这样文件变成了一个变量,前面要加上$。

3、 内容3: 整理头文件

我们可以将源文件分割出来的三个文件中共同使用的库或者函数以及宏定义,写到一个.h文件中,就像我们以前写的代码那样,然后在每个代码开始加入#include<*.h>.但是要注意的一点是,当头文件多于一个的时候,要注意不要将一个头文件包含两次,否则编译会出错。

4、 内容4:void load_gdtr(int limit, int addr)函数详解

在这里插入图片描述

函数作用:将指定的段的上界和起始地址赋给名为GDTR的48位寄存器,该寄存器不能用Mov指令来赋值。该寄存器的第16位(2字节)存放段的上限,剩下4个字节来存放段的起始地址。

函数演示执行过程:

在这里插入图片描述

注意:代码是以小端机器为例,演示过程的段上限为0x0000ffff,地址为0x00270000.

set_segmdesc函数解析:

在这里插入图片描述

ar高四位:GD00

80286时代不存在,386以后才存在的属性,G指的是Gbit,D指的是短的模式,1代表32位模式,0代表16位模式,这里的16位模式并不能调用bios。

ar低八位:

在这里插入图片描述

ps:这里的系统专用和应用程序指的就是我们学过的内核模式和用户模式。

5、 内容5:初始化PIC

中断之前我们除了需要初始化IDT和GDT,我们还要初始化PIC。

PIC:可编程中断控制器。它是将多个中断信号集合成一个中断信号的装置,PIC检测着输入管脚的多个中断信号,只要有一个中断信号过来,就将唯一的输出管脚信号变成ON,并通知给CPU。

PIC硬件结构:与CPU直接相连的PIC为主PIC,与主PIC相连的PIC称为从PIC。其中从PIC通过第2号IRQ与主PIC相连。(主PIC不通知给cpu,从pic也无法通知cpu)。

在这里插入图片描述

PIC初始化函数详解:(PIC是外部设备,CPU使用OUT指令进行操作。PIC0和PIC1分别指主PIC和从PIC。)

在这里插入图片描述

PIC的寄存器都是8位寄存器,IMR是“中断屏蔽寄存器”。8位分别对应8路IRQ信号。

禁止中断的原因:

a、防止在对中断设定的更改时,其他中断引起混乱;

b、没有连接设备时,静电干扰引起反应,导致系统混乱。

②ICW1:定值,由主板配线方式决定;

ICW4:定值,由主板配线方式决定;

在这里插入图片描述

ICW3:定值,主-从CPI的连接设定;主cpi由8位设定为定值00000100,从cpi由3位设定,定值为010。

在这里插入图片描述

ICW2:16位,决定PIC芯片发送哪一号中断通知CPU。

6、 中断处理程序的制作

通过学习,我先根据主函数理清了一下整体的思路:

首先,我们做的是对调色板初始化,将调色板号码写入0x03c8,按R,G,B顺序写入0x03c9,此时就可以使用调色板功能了,然后再通过putblock8_8或者putblock8_asc函数对屏幕显示进行设置,上节课我们还加入了鼠标的显示图案。

第二,我们已经知道了我们的系统会进行分段,然后我们要对GDT和IDT进行初始化,来管理分段中段的信息和管理中断号和处理函数。在GDT中,我们将段号为2的段进行了属性、大小等设置,这个段正好涵盖了整个bootpack.hrb。在IDT中,我们注册了我们对于鼠标、键盘的中断处理函数的中断号。

第三,然后我们就对PIC进行了设置,以传递中断信号。

最后,我们要通过sti指令,使CPU接受来自外部的中断。

注释:STI指令是CLI指令的逆指令,会使终端许可标志位变为1。

中断处理函数:

在这里插入图片描述

EXTERN指令表示call调用的函数来自该文件外;中断处理完成后不能执行return,而是要执行IRETD。

注释:IRETD将程序控制权从异常或中断处理程序返回异常、外部中断或软件生成的中断所中断的程序或过程,IRETD 助记符(中断返回双字)用于从使用 32 位操作数大小的中断返回。

在这里插入图片描述是因为c语言认为他们指的是同一个段,所以通过Mov指令,让他们值相等,让他们进入栈是方便在调用中断函数后恢复他们原来的值。

IDT的设定:

在这里插入图片描述

段号表明的是中断函数在哪一个段中,乘以8是因为后三位有其他意思。段号为2的段涵盖了整个bootpack.hrb。

在这里插入图片描述这个属性表示对中断的有效设定。

总结一下中断处理过程(以键盘中断为例):

当键盘触发中断后,IRQ1处传来一个中断信号到PIC0,然后就将唯一的输出管脚信号变成ON,并通知给CPU。如果CPU可以进行中断的话,就会令PIC发送两个字节的数据(0xcd和对应的中断号)给CPU,然后CPU就会根据IDT的设定,执行该中断号所对应的中断函数。

二、遇到的问题及解决方法

1.描述问题1:set_segmdesc函数中段的起始地址为什么要分为3段?

解决方法:书上说是为了和80286系统兼容,我百度了一下该芯片,得知80286的地址总线是24位,3个字节,所以适用386芯片的代码low的2字节加上mid的1字节刚好可适用于80286系统。

2.hlt可以接受来自外部的中断吗?

解决方法: HLT 执行操作后,使机器暂停工作,使处理器CPU处于停机状态,以等待一次外部中断到来,中断结束后,程序继续执行,CPU继续工作。

3.根据教材第114-115页的内容,画出8个字节(64位)的段描述符的分段组成图,标记出每一小段的起止范围(以位编号来标记,例如第0-15位),并解释每一小段的含义。

在这里插入图片描述

三、程序设计创新点

1、描述创新点1: 初始情况如左图,每按下空格小人就会跳一下。

在这里插入图片描述

关键实现:

在这里插入图片描述

在这里插入图片描述

四、实验心得体会

在第六天学习中,我学会了操作系统对中断的处理过程,更详细的了解到了GDT和IDT以及PIC的初始化过程。在学习的过程中,感觉自己新学了知识就会忘记前面学的,然后就要不时的去看代码还有以前写的日志,根据代码理清一下思路,才能继续往下学。而且要写一个系统,一定一定要对自己目前所拥有的硬件有足够的了解,然后还要注意自己写的系统最好能有很好的兼容性等等。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值