#Orange's 自制OS系列笔记(6)#保护模式(2)


保护模式和实模式一样,都是通过段寄存器和通用寄存器来进行寻址,区别是实模式只有20位地址线的寻址能力,而保护模式有32位地址线的寻址能力, 保护模式和实模式一样,也是把内存分成了一个个内存段来表示,把已经分好的内存段信息存入一张表格中,段寄存器中保存要访问的表格的索引,寻找内存段的流程如下图所示:



从上图理解几个概念:

段选择子:  图中段寄存器存放表中索引,我们也把段寄存器叫做段选择子,一共有16位 。

段描述符: 表中的每一个内存段信息称为一个段描述符,段描述符包括对应内存段的开始地址,结束地址以及一些段属性,每个段描述符都是8个字节大小。

段描述符表: 上图中的表格就是 段描述符表  段描述符 组成的表格称为段描述符表。

下面分别介绍以上几个概念。

段选择子

段选择子一共16位,但是只有高13位用来表示索引,低三位用来表示对应段描述符的属性。



RPL:Request Privilege Level , 用于特权检查

TI Table Indicator,用来表示是从全局描述符表(GDT)中读取描述符还是从局部描述符表(LDT)中读取描述符。

因为 只有高13位用来表示索引,其 可以表示2^13个段描述符,而TI又分GDT和LDT,所以一共可以表示 2^14 个段描述符,每个段描述符对应一个具体的段信息。

段描述符:

段描述符一共占有8个字节,包含了对应段的开始地址,界限以及其他信息。



8个字节大致可以分为以下4部分:



P1:这部分叫做段界限(segment limit),段地址界限实际一共20位,但是被分为了两部分,第一部分保存到了第一个字节和第二个字节中。

P2:这部分叫做段基地址(segment base),段基地址实际一共32位,但是也被分为两部分,第一部分放到了第三个字节, 第四个字节, 第五个字节中 。

P3:这部分叫做段属性(attributes),包含了对应内存段的属性,和段界限的第二部分(4bit)。

P4:这部分是段基地址剩余部分(base),是段基地址的第二部分(8bit)。

段属性:

上面的  段属性(attributes) 部分位于段描述符的第六个字节和第七个字节,它可以指定对应段是什么类型的段,比如可以是数据段,代码段或者是堆栈段 , 如果是数据段或者堆栈段,是否可读可写,如果是代码段,是否可以执行。段属性部分也可以指明段描述符指定的内存段在物理内存中是否真的存在 ,下面对段属性的每一位的作用进行详细解释。

段描述符的第六个字节:



Type: 说明对应段是代码段,数据段,还是堆栈段,是否可读可写或者可执行。
Dt:说明该描述符指定的段是系统段还是存储段,一般是存储段。
DPL:表示描述符的特权级别,最高位Ring0,最低为Ring3
P:表示描述符对应的实际物理地址是否有效,即该物理地址是否真的存在,0表示无效,1表示有效。

段描述符的第七个字节:



AVL:80836未做规定 ,保留位。
D:当对应段是代码段的时候,D=0表示是16位代码段, D=1表示是32位代码段;
       当对应段是数据段的时候,D=0表示是16位数据段, D=1表示是32位数据段;
G:段界限粒度位,G=0表示段边界是64K,G=1表示段边界是4GB,32位保护模式下G为1。


下一篇笔记继续写保护模式 (Protect Mode)。

该系列笔记也载于俺的个人网站:    http://zhangjinkun.com    , 欢迎访问。








#C++工程师#
全部评论

相关推荐

10-28 14:42
门头沟学院 Java
watermelon1124:因为嵌入式炸了
点赞 评论 收藏
分享
赏个offer求你了:友塔HR还专门加我告诉我初筛不通过😂
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务