文章目录
- 7.1 中断分类
- 外部中断
- 内部中断
- 7.2 中断描述符表
- 中断门描述符
- 中断描述符表寄存器IDTR
- 中断处理过程
- 中断发生时的栈变化
- 7.3 可编程中断控制器8259A
- 级联8259A
- 8259A的编程
- 7.4 编写中断处理程序
- 中断初始化过程
- 中断执行过程
- 简单的中断处理程序
- 中断处理程序改进
- 思考
- 7.5 8253定时器
- 8253内部结构
- 8253工作方式
- 初始化步骤
- 7.6 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