- 论坛徽章:
- 0
|
原帖由 epegasus 于 2009-11-13 19:33 发表 ![]()
谢谢.学了不少知识.
不过对于第2问,还是有点不清楚,我的意思是问:
假设一个IDT表项是一个中断门,里面存放的段选择符, 但并不能阻止人为的把这个选择符对应一个数据段段描述符, 当中断发生时(仅假设是MMI), 假设处理器通过中断门找到了这个段描述符,这个时候会发生什么?
-------
回楼上的:
情景分析叫穿过,我记不大清,所以叫穿越了,不过意思大致差不多.
定义为:一个外部中断发生时,或者一个int 指令发生时,到执行内存中的下一个指令前,所有处理器的行为.因为这中间处理器使用了一次IDT表项,所以叫"穿"......
OK,我继续给你讲下去!
(1)当 interrupt 发生时,processor 在 IDT 寻找到 gate descriptor,从而找到 code segment selector(interrupt services routine 的 code segment)。
(2)processor 会加载 code segment descriptor 进入 CS 寄存器
(3) 第 3 点是你想要知道的重点:
processor 在加载 code segment descriptor 进入 CS 寄存器之前,processor 会做一些工作,包括:
1、 descriptor 的 type check(类型检查)
2、 segment limit check(长度检查)
3、 descriptor & segment privilege check (权限检查)
只有通过它们的检查后,processor 才会转去执行 interrupt services routine
--------------------------------------------------------------------------------------------
第1点就是你想要的“segment descriptor 类型检查”,如果是 data segment descriptor 而不是 code segment descriptor 的话,就会产生 #GP 异常(通用保护异常)
产生 #GP 异常后,processor 就会转去处理 #GP 异常处理程序,如果问题没有得到解决的话,
最终会产生 #REST 机器不断重启
BTW: 我个人从来都不认为毛德操写的是好书!反而会误别人
劝各位不要沉迷于他的“linux情景分析”,实在不值得一看!!  |
评分
-
查看全部评分
|