码迷,mamicode.com
首页 > 其他好文 > 详细

IA-32e模式下的异常处理

时间:2018-10-14 19:18:30      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:选择   过程   异常   初始   手动   中断向量表   数据结构   陷阱   set   

系统异常处理

CPU如果调用系统异常处理程序

需要的数据结构
  • IDT_Table: 中断向量表, 在中断向量表中的每一项都是一个中断描述符(中断门或者陷阱门), 一个中断描述符中的几位是段选择符
  • GDT或者LDT
处理过程(没有特权变化的情况)
  • 中断向量号 -> IDT -> 中断描述符 -> 段选择子 -> GDT/LDT -> 段描述符 -> 基地址, 同时得知中断描述符保存的段内偏移量 -> 中断处理程序
处理过程(有特权变化的情况)
  • CPU将EFLAGS, CS, EIP, Error Code都压入栈

注意

  • 中断和异常向量都在一张IDT表中, IDT表总共256项
  • IDT表的前32项都是异常向量
  • 我们已经在head.S程序的前半部分手动初始化了一下IDT(是不完整的初始化), 在head.S程序的后半阶段我们setup IDT表示, 给这256个异常和中断向量的异常处理程序都设置为同一个目标代码地址, 都是显示一串字符串"Error! Unknown interrupt or fault at RIP"
  • 初始化完毕IDT之后, 紧接着我们要初始化TSS
真正进入到内核程度之后的系统异常处理
  • 在trap.c文件中对每一个异常都提供一个异常处理函数(trap, interrupt, system)

IA-32e模式下的异常处理

标签:选择   过程   异常   初始   手动   中断向量表   数据结构   陷阱   set   

原文地址:https://www.cnblogs.com/megachen/p/9787186.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!