返回信息流出自于渊的《自己动手写操作系统》随书代码 第三章 的 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
为什么编译出来还能够正常运行呢?
谢谢~!
这是一条镜像帖。来源:北邮人论坛 / soft-design / #35347同步于 2009/8/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
[求助]关于保护模式下的调用门和特权级
Raiden
2009/8/5镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
贴代码
【 在 Raiden (Raiden) 的大作中提到: 】
: 出自于渊的《自己动手写操作系统》随书代码 第三章 的 pmtest5(见附件)[upload=1][/upload][upload=2][/upload]
: 在pmtest5.asm中:
: 第28行,在全局描述符表中声明了一个调用门描述符,其DPL是3
: ...................
;有点长,贴一部分,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 的大作中提到: 】
: 贴代码
我看到的不是asm,是寂寞啊!
我搞过386调用门,是win32平台的,和你这个不太一样,不深究了。
【 在 Raiden (Raiden) 的大作中提到: 】
: ;有点长,贴一部分,NASM的格式
: ;宏Gate和Descriptor分别把参数填入描述符的各个字段
: ;DA_DPL3和SA_RPL3分别把描述符和选择子的DPL,RPL设置为3
: ...................
……呃……第一句话不太理解……是代码写得不好还是???
调用门倒是能工作,关键是书上写的那个CPL/DPL/RPL判断有点疑惑
可能是我哪个地方理解错了,调用门的DPL跟数据段的DPL应该是一样
的规则啊~
P.S. 久仰猫哥大名……
【 在 flyingkisser 的大作中提到: 】
: 我看到的不是asm,是寂寞啊!
: 我搞过386调用门,是win32平台的,和你这个不太一样,不深究了。
我只能说,如果在win32平台,你把dpl改成0,从ring3下call,应该会触发异常。
你搞的这套东西,是在哪里运行的?
【 在 Raiden (Raiden) 的大作中提到: 】
: 出自于渊的《自己动手写操作系统》随书代码 第三章 的 pmtest5(见附件)[upload=1][/upload][upload=2][/upload]
: 在pmtest5.asm中:
: 第28行,在全局描述符表中声明了一个调用门描述符,其DPL是3
: ...................
windows上用dosbox模拟的……
实验用
我也觉得应该触发异常
【 在 flyingkisser 的大作中提到: 】
: 我只能说,如果在win32平台,你把dpl改成0,从ring3下call,应该会触发异常。
: 你搞的这套东西,是在哪里运行的?
模拟的,别信。
你建议你,写驱动吧,在GDT中建立调用门,从ring3中call,比较准。
【 在 Raiden (Raiden) 的大作中提到: 】
: windows上用dosbox模拟的……
: 实验用
: 我也觉得应该触发异常
: ...................
写驱动,其实很容易,有个模板,搞清楚如何编译,如何调试就行。
至于加载,网上都有现在的加载器,我自己也写了一个。
【 在 flyingkisser (齐天大猫) 的大作中提到: 】
: 模拟的,别信。
: 你建议你,写驱动吧,在GDT中建立调用门,从ring3中call,比较准。