济南网站建设公司哪个好,wordpress轮播插件下载,品牌创意网站建设徕卡e,网站设计工程师培训对数据段特权检查对直接转移的代码段特权检查栈段的检查调用门的检查
权限问题:
由于CPL,DPL 无法完整表达权限的问题. 例如用户程序(CPL3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL0,此时可以为所欲为.因此加入RPL.此参数由操作系统来保证,CPU仅使用 RPL:…对数据段特权检查对直接转移的代码段特权检查栈段的检查调用门的检查
权限问题:
由于CPL,DPL 无法完整表达权限的问题. 例如用户程序(CPL3)通过调用门(将调用到内核过程,从低权限到高权限)执行,此时CPL0,此时可以为所欲为.因此加入RPL.此参数由操作系统来保证,CPU仅使用 RPL: 想以哪种权限去访问, 操作系统来填写, 一个自由的参数 描述符里的DPLCPLCS.RPL(16位中的低2位) DPL:访问此描述符的权限
对于数据段的特权检查:
从大方向说:只要权限比数据段大 或者相等就OK 实际根据以下几个步骤: CPL:当前CS段的RPL, RPL:请求这个数据段的权限, DPL: 数据段的权限 根据CPL, RPL , DPL 这3个来检查 CPL DPL RPL DPL
假设有 数据段 DPL 2:
代码段CPL0代码段CPL1代码段CPL2代码段CPL3RPL0 可访问RPL1可访问RPL2可访问RPL3 不可访问RPL1或2 可访问RPL0 可访问RPL1 可访问RPL2 不可访问RPL3 不可访问RPL2可访问RPL0可访问RPL1不可访问
可以看到CPL0的代码段,即使有最高权限,但如果RPL3,也无法访问至于CPL3的代码段,无论如何都无法访问,毕竟CPLDPL 对跳转或调用的代码段检查
这里特指 call far , jmp far
jmp , call ,ret 这些都是段内的, 不需要重新加载cs , 因此不做检查 调用过程的CPL,RPL 转移到此处的目标描述符的DPL,C(是否是一致性代码段) 综上CPL,RPL,DPL,C 4项参与检查又根据C 进行分别检查 if ( 1C ){ 一致性代码段检查} else { 非一致性代码段检查}
如果C0, 非一致性代码段的检查:
CPL DPL , 必须是相同特权级, 否则产生异常由于只能是平级跳转,因此转移前后CPL不变对于RPL: RPLCPL即可,毕竟RPL是一种希望用哪种方式(权限)去访问,RPL并不会影响CPL,RPL只用于检查
假设非一致性代码段的描述符:DPL2,C0
非一致性代码段描述符代码段CPL1代码段CPL2代码段CPL3现有非一致性代码段的描述符:DPL2,C0CPL不一致,RPL0~3都不可转移RPL0~2都可以转移,RPL3则无法转移CPL不一致,RPL0~3都无法转移--成功转移后,CPL不变,RPL只用作检查,而非赋值-
C1, 一致性代码段检查(依从性)
RPL不参与检查满足: CPLDPL(一致性代码段), 也就是当前特权比目标代码段低或相等即可一旦转移后, CPL不改变,依旧保持之前调用者的
假设一致性代码段的描述符:DPL1,C1
一致性代码段描述符代码段CPL1代码段CPL2代码段CPL3代码段CPL0一致性代码段的描述符:DPL1,C1可以访问可以访问可以访问不可以访问
RPL不参与检查,转移成功后CPL不改变
综上
对于代码段, 主要还是看CPL对于数据段,需要RPL来辅助检查
栈段检查
CPLRPLDPL
调用门检查
通过调用门可以执行一个高于本CPL的过程调用门指向了某个代码段内的某一个过程调用门本身也有DPL,想要使用调用门,调用者的CPL调用门DPL,也就需要达到使用调用门的权限访问调用门可以使用 jmp far , call far一旦访问了调用门,检查顺利后,根据调用门描述符内的 段选择子获取段描述符的基址 调用门内的偏移地址,就这个过程的线性地址调用门就是一个描述符,格式:
31 ~ 161514 ~ 131211 ~ 87 ~ 54 ~ 0段内偏移高16位PDPL0TYPE(1100)000参数个数
31 ~ 1615 ~ 0段选择子段内偏移低16位
调用门需要4项检查:当前调用者的CPL调用门选择子RPL (操作系统 自己维护)调用门描述符DPL目标代码段描述符的DPL检查2步: 首先要满足 本身能够访问调用门:CPL 门DPL, RPL 门DPL 下表格:
指令一致性代码段非一致性代码段call far代码段描述符DPLCPL代码段描述符DPLCPLjmp far代码段描述符DPLCPL代码段描述符DPLCPLcall far指令,栈切换CPl不发生变化,栈不切换CPL变成目标代码段的DPL,栈需要切换jmp far 指令,栈切换CPL不变,栈不切换由于DPLCPL,栈不切换
再一次的强调,权限无法从高到低只有CPL变了,栈才会变,因此上面只有当call指令调用 非一致性代码段的时候, 才会切换栈, 除非CPLDPL(例如CPL0,目标代码段描述符的DPL0)综上:对于一致性代码段: CPL目标代码段DPL, 不论JMP,CALL, 转移后CPL不变,栈不变对于非一致性代码段: CALL指令要求: CPL 目标代码段DPL , CPL变成目标代码段DPL, 切换栈(除非CPLDPL,那么栈不变) JMP 指令: CPL 目标代码段DPL , CPL不变,栈不变 看上去内容有点多,需要到处判断,一会门检查,一会代码段DPL检查,还要考虑栈切换的问题实际没那么麻烦,也就2条需要注意的 一个是有权限访问门 ,也就是本身权限至少要与门相等 数值上: CPL 门DPL, RPL 门DPL 调用者代码段的权限,要低于代码段或相等,也就是低权限到高权限,那么数值上: CPL 目标代码段DPL 至于jmp 和 call 的区别不用记, 让CPU产生保护性异常(GP)告诉我们即可,一旦产生异常说明此处jmp 指令有问题了( CPL ! DPL)对于栈的问题,一句话就解决,CPL一变, 栈跟着变 ; CPL不变,栈也不变
调用门的首次检查例子:
门描述符代码段A代码段B代码段C代码段D-门DPL3CPL3CPL2CPL1CPL0代码段A,B,C,D任意RPL0~3都可以访问门DPL2CPL3,RPL0~3都无法访问CPL2,RPL0~2可以访问,RPL3无法访问CPL1,RPL0~2可以访问,RPL3无法访问CPL0,RPL0~2可以访问,RPL3无法访问A的CPL权限不足以访问门DPL;B,C,D的CPL全部满足,同时:RPL门DPL