首页 > 代码库 > Analysis of segment descriptor —— JOS

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 当前特权级

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











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




Analysis of segment descriptor —— JOS