首页
论坛
专栏
课程

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

2009-4-16 00:55 3388

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

2009-4-16 00:55
3388
俺发现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。

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

[推荐]看雪企服平台,提供安全分析、定制项目开发、APP等级保护、渗透测试等安全服务!

上一主题 下一主题
最新回复 (4)
Nooby 5 2009-4-16 01:15
2
0
中断指令或者异常无视CPL判断
只是学习 2009-4-16 01:25
3
0
还有这个规则?扬季文那本书上的描述不象楼上说的那样

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

不仅异常 还有中断也受这个影响呀,楼上的能细说下吗?
sessiondiy 4 2009-4-16 02:15
4
0
你在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 15:23
5
0
谢楼上的指点,我翻下intel手册去
游客
登录 | 注册 方可回帖
返回