首页 > 代码库 > 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