操作系统真相还原_第7章:中断

文章详细阐述了x86系统中的中断分类,包括外部中断和内部中断,以及中断描述符表的作用和中断处理过程。介绍了可编程中断控制器8259A的功能和编程方法,同时展示了如何编写和改进中断处理程序。此外,还探讨了8253定时器的内部结构、工作方式和使用步骤。

7.1 中断分类

外部中断

分为可屏蔽中断与不可屏蔽中断

内部中断

分为软中断与异常

7.2 中断描述符表

中断门描述符

中断描述符表寄存器IDTR

中断处理过程

CPU外部:外部设备的中断由中断代理芯片接收,处理后将该中断的中断向量号发送到CPU
CPU内部:CPU执行该中断向量号对应的中断处理程序

CPU内部处理细节:
处理器根据中断向量号定位中断门描述符
处理器进行特权级检查(若中断由软中断引发(由用户进程引发)
则需满足,目标代码段特权级>当前特权级>调用门特权级;若中断由外部设备和异常引发
则需满足,目标代码段特权级>当前特权级)
执行中断处理程序

中断发生时的栈变化

7.3 可编程中断控制器8259A

级联8259A



INT:选出优先级最高的中断请求后,发信号通知CPU
INTA:位于8259A,接收来自CPU的中断响应信号
IMR:中断屏蔽寄存器
IRR:中断请求寄存器
PR:优先级仲裁器
ISR:中断服务寄存器,保存正在处理的中断(或被中断的中断)

8259A的编程

8259A的编程分为两部分,初始化和操作两部分
操作ICW寄存器组进行初始化,操作OCW寄存器组对8259A进行操作

ICW寄存器组:

OCW寄存器组:

写入方式:

7.4 编写中断处理程序

中断初始化过程

1、中断描述符表初始化(intr_desc->(gdt-> intr_entry_table) -> idt_table)
2、中断函数注册(idt_table、intr_name)
3、中断代理初始化

中断执行过程

执行过程:
1、intr_desc+中断号*8获取中断描述符
2、从中断描述符中获取段选择子与偏移地址
3、通过段选择子从gdt中获取intr_entry_table基地址
4、基地址结合偏移地址进入中断处理前置程序
5、中断处理前置程序通过中断号从idt_table获取中断处理程序地址进入中断处理程序
6、中断处理程序执行完毕,返回中断处理前置程序,上下文恢复

简单的中断处理程序

代码目录:

百度网盘分享链接:https://pan.baidu.com/s/1I4NuGdMvFj740DIXQ7m5aA
提取码:e60z

编译、链接并写入磁盘:

物理内存使用情况:
系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB
内核位于0x1500

中断处理程序改进

代码目录:

百度网盘分享链接:https://pan.baidu.com/s/18s8UPgUGpzcHpqhvZitdwA
提取码:1j77

编译、链接并写入磁盘:

启动bochs执行:
./bochs/bin/bochs -f bochs/boot.disk

系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB
内核位于0x3000
(由于内核变大,会覆盖仍需使用的loader,于是将内核移至0x3000)

思考

关于kernel.S中的中断处理前置程序中为何有的中断压栈0:
因为有的中断返回时会在栈中压入0,而有的不会,所以我们将没有压入0的中断在中断前置程序手动压入0,这样所有中断都会压入0,在中断前置程序中可以统一处理
补充:0实际上是错误码

问题:
自动压入错误码的中断中,其压入中断的时机
我没找到,因为整个中断处理过程都有我们自主控制但我没有发现其压入时机,难道在某一过程隐式压入?

7.5 8253定时器

8253内部结构


CLK:时钟输入信号,每当该引脚收到一个时钟信号,减法计数器就将计数值减1
GATE:门控输入信号,在不同工作方式下GATE的作用不同
OUT:计数器输出信号,根据OUT引脚输出信号判断计数是否完成

计数器:

控制字寄存器:
控制字寄存器是8位大小的寄存器,其操作端口为0x43,也称为模式控制寄存器
控制字格式:

8253工作方式

计数开始的条件:
1、GATE为高电平,由硬件控制
2、计数初值已写入计数器的减法计数器中

工作方式简介:

初始化步骤

1、向控制字寄存器端口0x43写入控制字
2、向计数器写入计数初值

7.6 8253定时器的使用

代码目录:

百度网盘分享链接:https://pan.baidu.com/s/1PORB6Pt4s6OcmbBUOsn32A
提取码:tsxm

编译、链接并写入磁盘:

启动bochs执行:
./bochs/bin/bochs -f bochs/boot.disk

系统信息(ards信息)位于0x500
mbr.s位于0x7C00~0x7E00,占用0.5KB
loader.s位于0x2000~0x2800,占用2KB
页目录表位于0x100000~0x101000,占用4KB
缓冲区位于0x70000~0x100000,占用192KB
内核位于0x3000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值