Analysis of segment descriptor —— JOS

Analysis of segment descriptor


在/kern/env.c 里面会看见GDT(global descriptor table)的定义,把用户空间的数据段,代码段与kernel 数据段代码段分离开来.

                           


GD_** 的定义在/inc/memlayout.h 里面


会发现这里GD_KT GD_KD ... 他们都的低3bits都是0,为什么?着关乎segment descriptor的定义





CPL :current privilege level 当前特权级(存在于当前进程的段描述符里面 segement descriptor)

RPL(requested privilege level) 申请的特权级(存在于段选择符里 segment seletor)

DPL(descriptor privilege level) 段特权级,存在于段描述符里 segment descriptor


So ... 特权级?



OK,到这里 gobal descriptor的部分就讲清楚了

根据下面的定义我们可以知道GDT共有 6 个描述符,一个 SEG_NULL,kernel 数据段,kernel 代码段 ,user 数据段,user 代码段,以及任务段选符。




对于segement descriptor 怎么初始化呢? 这里JOS采用了宏定义 SEG()

可以看到struct Segdesc的定义如下


(题外话,JOS这里采用了结构体分字段的方式,而Linux 0.11则是采用的两个long long变量来记录这些信息)




看看初始化的macro SEG


注意倒数2 3 个初始化数据都是1,这里意在指定segment的长度是 32bits的,且段内以4K为最小单位

关于struct Segdesc的初始化中有这样的代码:最后的初始化参数0指定了dpl,即0特权级(最高了)


STA_X STA_R 写明了该段的type,这里是关于type的各种类型:这些都是应用



经过上述介绍可以认识到 

           内核代码段被标记为    可执行&可读 

           内核数据段被标记为    可读写

           用户代码段被标记为    可执行&可读

            用户数据段被标记为   可读写

各个段的段内基地址都从0x0开始,内核段的特权级为0,用户段的特权级为3




                    









二零一四年 摄于 前往妙音寺的路上




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值