首页
社区
课程
招聘
[旧帖] [求助]关于异常发生后保护模式下权限转移疑惑 0.00雪花
发表于: 2009-4-16 00:55 4851

[旧帖] [求助]关于异常发生后保护模式下权限转移疑惑 0.00雪花

2009-4-16 00:55
4851
俺发现IDT表中很大一部分的异常处理程序其描述符的DPL为0

比如0号除数为0的那个异常描述符对应的DPL就为0,
Index    Selector:Offset        Type    DPL    P bit
000     0008:804DF51E            E      00       P
假设我们用户态的程序执行了下面代码
int a=9,b;
b=a/0;
CPU应该捕获到该异常并跳入到其对应的异常处理程序,但是依照保护模式的规则,
必须先检查CPL<=DPL 才会进行权限转移。可当前的CPL是3,而DPL为0。

我不知道我哪里理解错了?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
中断指令或者异常无视CPL判断
2009-4-16 01:15
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
还有这个规则?扬季文那本书上的描述不象楼上说的那样

还找了篇资料:其中有这样描述。
“    DPL等于0或者是3. 0是特权等级(内核模式).  当前的执行等级被保存在CPL寄存器中
(Current Privilege Level). 控制单元UC (Unit Of Control) 比较CPL中的值和IDT中断
描述符中的DPL字段。假如DPL值大于(较小权限)或者等于CPL值,那么中断处理过程被执行。
用户应用程序在ring3(CPL==3)中执行。某些中断在用户态是不能够被调用的。”

不仅异常 还有中断也受这个影响呀,楼上的能细说下吗?
2009-4-16 01:25
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
4
你在1楼问的东西: 若 CPL<DPL(中断程序所在节区) 是会产生保护例外的 INT 0D
(等级高的不可以呼叫等级低的)
因为中断何时都可能发生, 为了避免保护例外所以很多可能在任何时候都可能发生的中断
例如 除零(INT 0) , 其 DPL设为0 , 没人比 0 更低了. Ring0~3 都可用.
而常见的 INT 2E 只给 Ring3用, 所以他的 DPL 被设为 3.

而你在3楼写的刚好相反, 唯一的解释是他讲的是我们程序内写的 INT xx 所制造出来的中断
因为这种制造出来的中断尚需再多一项检查 : 需 CPL<=DPL 才有制造的资格.
你可以试试你在程序写个 INT 00 来看看他会到 INT 0D 还是真的进入 INT 00
INT 00 的 DPL = 0
而你的程序 CPL = 3
CPL>DPL 你无权制造这个中断, 将产生保护例外 INT 0D , 所以是进入了 INT 0D
而非你愿进 INT 00
2009-4-16 02:15
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢楼上的指点,我翻下intel手册去
2009-4-16 15:23
0
游客
登录 | 注册 方可回帖
返回
//