五、中断描述符表IDT
1.基本概念
中断描述符表是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序入口地址。
在允许发生中断以前,必须适当地初始化IDT
TSS只能位于GDT中,IDT能位于内存的任何的地方
2.中断描述符
硬件提供的中断描述符:
(1)任务门:中断信号发生时,必须取代当前进程的那个进程的TSS选择符存放在任务门中
(2)中断门:包含段选择符和中断处理程序的段内偏移
(3)陷阱门:与中断门的唯一区别是,通过中断门进入服务程序后,自动关中断,而通过陷阱门进入服务程序不自动关中断
Linux中使用的中断描述符:
中断描述符的类型 用户态能否访问 用户态的访问方式 能激活的程序 中断门 否 所有的Linux中断处理程序 系统门 是 into、bound、int $0x80 向量号为4,5,128的三个Linux异常处理程序 系统中断门 是 int 3 与向量3相关的异常处理程序 陷阱门 否 大部分Linux异常处理程序 任务门 否 Linux对Double fault异常的处理程序Linux中的系统门、系统中断门、陷阱门使用的都是硬件中的陷阱门
Linux利用中断门处理中断,利用陷阱门处理异常
Double fault是唯一用任务处理的异常
3.中断向量与中断和异常的关系
(1)每个中断和异常是由0-255之间的一个数来标识的,这个数就是1中的中断向量
(2)大约有20种异常,内核为每一个异常分配了一种中断/异常向量分别是0-19
(3)0x80是系统调用的中断向量
(4)32-255是内核为什么中断分配的中断向量。然而,224个中断向量显然不够,因此系统为每个中断向量设置一个队列,根据每个中断源所使用的中断向量,将其中断服务程序挂到相应的队列中。中断发生时,先执行与中断向量相对应的一段总服务程序,再根据具体的中断源设备号在其所属的队列找到特定的中断服务程序加以执行。
4.中断向量、与中断向量相对应的总服务程序、某个中断源的中断服务程序之间的关系如图所示:
(1)irq_desc是中断向量描述符队列(中断描述符是INT的一项,中断向量描述符是一个数据结构,用于描述与中断向量相关的服务程序)
(2)irq_desc_t是中断向量描述符的数据结构
(3)irqaction是挂在某个中断向量的具体的中断服务程序的描述符,组成一个队列
(4)hw_irq_controller是这个中断向量的总服务程序
六、IDT的初始化
1.两次初始化
运行模式 初始值 使用者 第一次 实模式 空处理程序 BIOS例程 第二次 保护模式 有意义的中断处理程序或异常处理程序 Linux系统2.在IDT表的初始化完成之初,每个中断处理队列都是空的,此时即使打开中断并且某个外设中断真的发生了,也得不到实际的服务,因为没有执行具体的中断处理程序。
真正的中断服务要到具体设备的初始化程序将其中断处理程序ISR挂入某个中断请求队列后才会发生
3.在允许发生中断以前,必须适当地初始化IDT
七、激活中断或异常(以下内容都是由硬件自动完成)
1.确定与中断或异常相关的中断向量号
中断:硬件设备控制器通过IRQ向CPU发出信号,中断管制器把接受到的信号转换为中断向量号i
异常:对于软件指令发出或产生的异常,CPU会差别归类错误的类别,这个类别号就是中断向量
2.IDT第i项 -----> 段选择符 ----->段描述符 -----> 段基址
3.IDT第i项 -----> 偏移量
4.段基址 + 偏移量 -----> 中断处理程序第一条指令的地址
5.在栈中保存EFLAGS、CS、EIP的内容
6.如果异常产生了一个出错码,把它保存在栈中
7.装载CS、EIP,其值分别是2-段选择符和4-偏移量,由这两个寄存器可得到中断或异常处理程序第一条指令的地址
- 看不过瘾?点击下面链接!
- Ubuntu开机密码忘记了怎么办?
- 在Linux系统中限制CPU占用率的教程
- Linux如何禁止特定ip地址访问
- Linux找回丢失磁盘空间的方法
- Linux如何查看最后重启时间
- CentOS 7系统远程会话管理工具screen怎么安装使用?