保护模式(二)base、limit、s、type、gb、段权限检查
段选择子结构图
base、limit、g位
以段选择子0x0023为例
拆分 0000 0000 0010 0011
rpl:3
ti:0
index:4
即查gdt表,第5个段描述符
接下来拆分 00cff300 0000ffff
顺序为先看p位,再看g位
base:0000 0000 (高32位的两边,跟低32位的左边)
limit:f ffff
g:1 ->limit: f ffff fff
注释:
其中limit前半部分为高32位的16-24位,也是就左边数第二个字节的低一个字节
后半部分为低32位的0-15位,也就是低32位的低两个字节
g位为第23位,找时找高32位的左边数第二个字节的高一个字节是否大于8
若g=1,limit后面补齐三个fff,若为0,limit 前面补齐三个000
p、s、type位
接着上面继续拆
由结构图看出,p位为高32位第15位,即高四字节的左起第一个字节f3->1111 0011
p:1
dpl:3
s:1
type:0011
注释:
p为1表示段描述符可用,dpl权限相关,s为1时此描述符为数据或者代码段描述符,为0位系统段描述符
当s为1时,查上表确定到底是数据段描述符还是代码段。
上表为type。0011,0为数据段描述符,0向上拓展,1可写,1已访问过,c可执行,r可写
当e为0时,作图为向上扩展,即可访问范围是base-limit。
D/B位(简单了解即可)
段权限
mov ax,000b
mov ds,ax
为例
可以看出 000b,rpl为3,然后需要查询对应段描述符的dpl,cpl需要看cs/ss段寄存器的低两位。
cpl<=dpl 并且 rpl<=dpl
代码段跟系统段描述符检查方式不一样,具体后面学会了再更
思考:既然已经有CPL(当前特权级别)了,为什么还要有RPL(请求特权级别)
回答:我们的程序本可以用“读写”的权限去打开一个文件,但为了避免出错,有些时候我们使用“只读”的权限去打开