码迷,mamicode.com
首页 > 其他好文 > 详细

Analysis of segment descriptor —— JOS

时间:2014-10-14 14:37:48      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:操作系统   descriptor   

Analysis of segment descriptor


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

                           bubuko.com,布布扣


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

bubuko.com,布布扣

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


bubuko.com,布布扣

CPL :current privilege level 当前特权级

So ... 特权级?

bubuko.com,布布扣

bubuko.com,布布扣

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

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

bubuko.com,布布扣



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

可以看到struct Segdesc的定义如下

bubuko.com,布布扣

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


bubuko.com,布布扣


看看初始化的macro SEG

bubuko.com,布布扣

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

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

bubuko.com,布布扣

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

bubuko.com,布布扣


经过上述介绍可以认识到 

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

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

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

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

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

bubuko.com,布布扣










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

bubuko.com,布布扣



Analysis of segment descriptor —— JOS

标签:操作系统   descriptor   

原文地址:http://blog.csdn.net/cinmyheart/article/details/40075257

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!