BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35347同步于 2009/8/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

[求助]关于保护模式下的调用门和特权级

Raiden
2009/8/5镜像同步12 回复
出自于渊的《自己动手写操作系统》随书代码 第三章 的 pmtest5(见附件) 附件(10.2KB) pmtest5.asm 附件(9.8KB) pm.inc 在pmtest5.asm中: 第28行,在全局描述符表中声明了一个调用门描述符,其DPL是3 第48行,声明该调用门所对应选择子的RPL是3 第441行,在ring3级的代码段中用call指令通过调用门调用目标ring0代码段 我把28行和48行的DPL、RPL都改为0,那么在ring3的代码段中,其CPL是3 而此时,调用门的DPL是0,不满足CPL<=DPL, RPL<=DPL 为什么编译出来还能够正常运行呢? 谢谢~!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
coolwc机器人#1 · 2009/8/5
路过
flyingkisser机器人#2 · 2009/8/5
贴代码 【 在 Raiden (Raiden) 的大作中提到: 】 : 出自于渊的《自己动手写操作系统》随书代码 第三章 的 pmtest5(见附件)[upload=1][/upload][upload=2][/upload] : 在pmtest5.asm中: : 第28行,在全局描述符表中声明了一个调用门描述符,其DPL是3 : ...................
Raiden机器人#3 · 2009/8/5
;有点长,贴一部分,NASM的格式 ;宏Gate和Descriptor分别把参数填入描述符的各个字段 ;DA_DPL3和SA_RPL3分别把描述符和选择子的DPL,RPL设置为3 ;DA_386CGate设置描述符为386调用门 ;那个通过调用门调用的代码段是非一致的 ;GDT: [SECTION .gdt] LABEL_GDT: Descriptor 0, 0, 0 ;GDT中声明的调用门 LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGate + DA_DPL3 ;......其他描述符声明 ; 调用门的选择子 SelectorCallGateTest equ LABEL_CALL_GATE_TEST - LABEL_GDT + SA_RPL3 ;......其他选择子声明 ; ring3 的代码段,从ring0通过push这个段的cs:eip和ss:esp,然后用retf指令转到这里 [SECTION .ring3] align 32 [BITS 32] LABEL_CODE_RING3: ; 往显存写字符'3' mov ax, SelectorVideo mov gs, ax mov edi, (80 * 12 + 0) * 2 mov ah, 0bh mov al, '3' mov [gs:edi], ax ; 通过之前声明的调用门调用一个ring0的任务 call SelectorCallGateTest:0;就这句 SegCodeRing3Len equ $ - LABEL_CODE_RING3 ;...... 我把描述符和选择子中的DA_DPL3和SA_RPL3改为设置DPL和RPL为0, 为啥红色那句call还能够执行? 谢谢~! 【 在 flyingkisser 的大作中提到: 】 : 贴代码
flyingkisser机器人#4 · 2009/8/5
我看到的不是asm,是寂寞啊! 我搞过386调用门,是win32平台的,和你这个不太一样,不深究了。 【 在 Raiden (Raiden) 的大作中提到: 】 : ;有点长,贴一部分,NASM的格式 : ;宏Gate和Descriptor分别把参数填入描述符的各个字段 : ;DA_DPL3和SA_RPL3分别把描述符和选择子的DPL,RPL设置为3 : ...................
Raiden机器人#5 · 2009/8/5
……呃……第一句话不太理解……是代码写得不好还是??? 调用门倒是能工作,关键是书上写的那个CPL/DPL/RPL判断有点疑惑 可能是我哪个地方理解错了,调用门的DPL跟数据段的DPL应该是一样 的规则啊~ P.S. 久仰猫哥大名…… 【 在 flyingkisser 的大作中提到: 】 : 我看到的不是asm,是寂寞啊! : 我搞过386调用门,是win32平台的,和你这个不太一样,不深究了。
flyingkisser机器人#6 · 2009/8/5
我只能说,如果在win32平台,你把dpl改成0,从ring3下call,应该会触发异常。 你搞的这套东西,是在哪里运行的? 【 在 Raiden (Raiden) 的大作中提到: 】 : 出自于渊的《自己动手写操作系统》随书代码 第三章 的 pmtest5(见附件)[upload=1][/upload][upload=2][/upload] : 在pmtest5.asm中: : 第28行,在全局描述符表中声明了一个调用门描述符,其DPL是3 : ...................
Raiden机器人#7 · 2009/8/5
windows上用dosbox模拟的…… 实验用 我也觉得应该触发异常 【 在 flyingkisser 的大作中提到: 】 : 我只能说,如果在win32平台,你把dpl改成0,从ring3下call,应该会触发异常。 : 你搞的这套东西,是在哪里运行的?
flyingkisser机器人#8 · 2009/8/5
模拟的,别信。 你建议你,写驱动吧,在GDT中建立调用门,从ring3中call,比较准。 【 在 Raiden (Raiden) 的大作中提到: 】 : windows上用dosbox模拟的…… : 实验用 : 我也觉得应该触发异常 : ...................
flyingkisser机器人#9 · 2009/8/5
写驱动,其实很容易,有个模板,搞清楚如何编译,如何调试就行。 至于加载,网上都有现在的加载器,我自己也写了一个。 【 在 flyingkisser (齐天大猫) 的大作中提到: 】 : 模拟的,别信。 : 你建议你,写驱动吧,在GDT中建立调用门,从ring3中call,比较准。