《Orange's 一个操作系统的实现》学习笔记(二) 实模式和保护模式

来源:互联网 发布:全息图片制作软件 编辑:程序博客网 时间:2024/05/16 13:41


保护模式下的内存寻址
8086一共有20位地址线,最大只有1MB的寻址能力,所以实模式下物理地址的计算公式是
物理地址 = 段值 * 16 + 偏移
段值被存放在段寄存器中,并且段的最大长度不超过2^16,也就是64kb。
从80386开始cpu进入32位时代,寻址空间达到4GB,保护模式下段寄存器保存不了段的所有信息且寄存器的个数有限,所以不能采用实模式的寻址方式,而是一种新的方式,
在保护模式下,段寄存器中存放的不是寻址段的基地址,而是一个指向段描述符表的索引,段描述符的作用是描述这个段的信息,包括段的基址,界限,以及额外的一些属性信息,
简单地说,保护模式下的寻址方式就是通过Selector(段选择子)找到存储在Descriptor Table(描述符表)中某个Descriptor(段描述符),该段描述符中存放有该段的物理首地址,所以就可以找到内存中真正的物理段首地址,Offset(偏移量)就是相对该段的偏移量,物理首地址+偏移量就得到了物理地址。
 具体的来看段描述符的结构,如书上的图介绍的那样
以下是代码段和数据段描述符的通用结构

段描述符表不止一个。首先有一个全局段描述符表,简称GDT,每个程序都有自己的段描述符表,简称LDT。80386里面引入了两个新的寄存器,一个是48位的全局描述符表寄存器GDTR,指向全局描述符表GDT的首地址,一个是16位的局部描述符表寄存器LDTR,它的值随时变化,总是指向CPU当时正在执行的那个程序的局部描述符表LDT。LDT中存放的是GDT中的索引值,描述符中的ti所代表的含义就是表指示标志,当TI位为0时,从全局描述符表中找Ti位为1  表示从局部描述符表中找。

各属性位具体作用如下:
G:G=0时,段限长的20位为实际段限长,最大限长为2^20=1MB
    G=1时,则实际段限长为20位段限长乘以2^12=4KB,最大限长达到4GB
D/B:当描述符指向的是可执行代码段时,这一位叫做D位,D=1使用32位地址和32/8位操作数,D=0使用16位地址和16/8位操作数。如果指向的是向下扩展的数据段,这一位叫做B位,B=1时段的上界为4GB,B=0时段的上界为64KB。如果指向的是堆栈段,这一位叫做B位,B=1使用32位操作数,堆栈指针用ESP,B=0时使用16位操作数,堆栈指针用SP。
AVL:available and reserved bit 通常为0
P:存在位,P=1表示段在内存中
DPL:特权级,0为最高特权级,3为最低,表示访问该段时CPU所需处于的最低特权级
S:S=1表示该描述符指向的是代码段或数据段;S=0表示系统端(TSS、LDT)和门描述符
TYPE:类型,和S结合使用
S=1且TYPE<8时,为数据段描述符。数据段都是可读的,但不一定可写。
至于段选择子,段选择子的内容是相对于段描述符首的偏移量,因为cpu在运行时不知道内存中的段描述符表的位置,所以我们要用这种基址加偏移的方式找到内存中的段描述符,然后得到段的信息,并进一步计算出物理地址。

0 0
原创粉丝点击