概述
i386中在每个段选择子中都有两个位来表示访问该选择子的最低权限,称为DPL。linux使用0(二进制00)和3(二进制11)两个权限级别。
对于linux而言,只有四个选择子:用户CS选择子,用户DS选择子,内核CS选择子,内核DS选择子。它们保存在GDT的3到6的位置(即下标2-5)。
i386中存在cs,ds,ss寄存器。cs寄存器中存放用户或者内核CS选择子,ds寄存器和ss寄存器的内容相同,存放用户或者内核DS选择子。
当linux处于用户态的时候,寄存器中存放用户选择子;内核态时则存放内核选择子。
cs寄存器存放的选择子的DPL称为CPL,表示当前操作系统所处的权限级别。
i386规定,只有DPL小于或者等于要访问的选择子的CPL时,访问才能通过。这样,因为不同的段选择子对应着不同的线性地址,所以可以控制低级别的代码无法访问高级别的内存地址。
但linux却对四个选择子都设置了同样的地址空间,这就放弃了i386的段保护机制。而其保护机制则是通过在每个页表项中设置两位表示访问该页的最低权限。当CPL低于或者等于该权限时,则可以访问该页。
因为仍然要使用CPL,所以还是无法完全绕过段机制。因为CPL正是CS寄存器所保存的段选择子(可以是内核或用户cs段选择子)的DPL位段。
另外,当linux通过中断门或trap门进入内核时,会改变cs寄存器为内核cs选择子;当返回时,恢复用户cs选择子。通过这种方式来实现CPL的改变。
来自:http://www.newsmth.net/pc/pccon.php?id=1363&nid=264166
最后
以上就是帅气月饼为你收集整理的linux对i386保护模式的选择性使用的全部内容,希望文章能够帮你解决linux对i386保护模式的选择性使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复