+ -
当前位置:首页 → 问答吧 → 【虎彡】保护模式,跳转‘定律’

【虎彡】保护模式,跳转‘定律’

时间:2011-02-15

来源:互联网

所有的程序转跳,CPU都不会把段选择子的RPL赋给转跳后程序的CS.RPL. .

     转跳后程序的CPL(CS.RPL)只会有下面的俩种可能
     转跳后程序的CPL(CS.RPL) = 转跳前程序的CPL(CS.RPL) 
     或
     转跳后程序的CPL(CS.RPL) = 转跳后程序的CodeDescriptor.DPL

  有点抽象 请高手解释一下呗!

作者: znxllyuan   发布时间: 2011-02-15

选择子出现在几个地方,一种是在指令的操作数中,这时候的选择子的RPL只是用于检测访问是否合法的,如果符合max(CPL,RPL)<=DPL就允许访问,但这个RPL不会形成最终的CPL。为什么不能直接用这个RPL作为新的CPL呢?其实从访问规则就可以看出如果这个做的话特权就只能变低或者相同不能变高了,也就是特权3的代码永远也无法调用特权更高的代码了,这个和调用规则刚好相反,调用规则要求权限低的代码之后调用权限相同或者更高的代码,也就是应用程序级能调用操作系统级代码,不能反过来。对于任务切换就任何权限之间切换都有可能。
所以CPU不可能直接把选择子的RPL赋给新的CS.RPL。对于外层代码调用内层代码也就是低权限调用高权限就只能通过调用门间接处理,这时候call只能中出现的选择子的RPL用于检查访问是否符合要求,真正形成最新的CS.RPL的是调用门里面代码选择子所指向的代码描述符的DPL。
至于同权限调用没那么多问题,就相当于你说的转跳后程序的CPL(CS.RPL) = 转跳前程序的CPL(CS.RPL)。

作者: manfeng   发布时间: 2011-02-15

引用 1 楼 manfeng 的回复:
选择子出现在几个地方,一种是在指令的操作数中,这时候的选择子的RPL只是用于检测访问是否合法的,如果符合max(CPL,RPL)<=DPL就允许访问,但这个RPL不会形成最终的CPL。为什么不能直接用这个RPL作为新的CPL呢?其实从访问规则就可以看出如果这个做的话特权就只能变低或者相同不能变高了,也就是特权3的代码永远也无法调用特权更高的代码了,这个和调用规则刚好相反,调用规则要求权限低的代码之……

哦 同权限跳转后 CPL不变
用门跳转可把低级CPL变成高级段DPL的级别?


书上从开始说 特权的性质是同级和同级高级访问低级,不能用低级访问高级
可是为什么现在变成高级不能访问低级了?

作者: znxllyuan   发布时间: 2011-02-15