标签:活动 script append var 另一个 2.4 windows 检查 微处理器
内存控制单元(MMU):逻辑地址=>物理地址
内存仲裁器:
字段名 | 描述 |
---|---|
Base | 包含段的首字节的线性地址 |
G | 粒度标志:0,段大小以字节为单位;否则以4KB字节的倍数计 |
Limit | 存放段中最后一个内存单元的偏移量,从而决定段的长度 |
S | 系统标志:被清0 - 这是一个系统段;否则是一个普通的代码段或数据段 |
Type | 描述了段的类型特征它的存取权限 |
DPL | 描述符特权级字段:设为0的段只能当CPL为0时,才可访问;DPL为3的段对任何CPL值都是可访问的 |
P | Segment-Present标志:0 - 段当前不在主存中;linux总是把这个标志(47位)设为1,因为它从来不把整个段交换到磁盘上去 |
D或B | 称为B或D标志,取决于代码段还是数据段;如果偏移量的地址是32位,基本上设为1,若为16位,则被清为0 |
AVL标志 | 可以有操作系统使用,但被Linux忽略 |
- 有几种不同类型(Type)的段以及和他们对应的段描述符,Linux中被广泛采用的类型:
- 代码段描述符:表示这段描述符代表一个代码段,它可以放在GDT或LDT中,该描述符置S标志为1(非系统段)
- 数据段描述符:表示这个段描述符代表一个数据段,它可以放在GDT或LDT中,该描述符置S标识为1,栈段是通过一般的数据段实现
- 任务状态段描述符(TSSD):该描述符代表一个任务状态段,也就是说这个段用于保存处理器寄存器的内容,它只能出现在GDT中
- 根据相应的进程是否在CPU上运行,其Type字段的值分别为11或9,该描述符的S标志置为0
- 局部描述符表描述符:表示这个段描述符代表一个包含LDT的段,它只出现在GDT中,Type值为2,S标志置为0
80x86处理器提供了一种附加的非编程的寄存器(不可被设置),可供6个可编程的段寄存器使用
段选择符字段
字段名 | 描述 |
---|---|
index | 指定了放在GDT或LDT中的相应段描述符 |
TI | 0:段描述符是在GDT中;1:在LDT中 |
RPL | 请求者特权级:当段选择符装入CS寄存器中时指示CPU当前的特权级;此外在访问数据段时有选择的削弱处理器的特权级 |
- 由于段选择符是8位字节长,因此它在GDT或者LDT内的相对地址是有段选择符的最高13位的值乘以8得到的
例如:GDT在0x200020000,且有段选择符所指定的索引号为2,那么相应的段描述符地址是0x00020000 + (2 x 8),或者0x00020010
(GDT的基地址保存在gdtr寄存器中)
逻辑地址转换为物理地址的过程
有了段寄存器相关的不可编程寄存器,只有当段寄存器的内容被串改时才需要执行前两个操作
Linux更偏向于使用分页,因为:
段选择符由宏__USER_CS,__USER_DS,__KERNEL_CS和__KERNEL_DS分别定义
为了对内核代码段寻址,内核只需要把__KERNEL_CS宏产生的值装进CS段寄存器
用用户下和内核态下所有进程可以使用相同的逻辑地址
因为与段相关的线性地址从0开始,达到2的32次方减去1的寻址限长
在Linux下逻辑地址与线性地址是一致的,即逻辑地址的偏移量字段的值与相应的线性地址的值总是一致的
因为所有字段都从0x00000000开始
只要当前的特权级被改变,一些段寄存器必须相应的更新,例如ds段寄存器(ss段寄存器也一样):
GDT表:
GDT表中段选择符的说明:
页目录:
页目录项和页表项具有相同的结构,每一项都包含下面字段:
扩展分页用于把大段的连续的线性地址转换为物理地址
分页单元把32位线性地址分为两个字段:
标签:活动 script append var 另一个 2.4 windows 检查 微处理器
原文地址:http://blog.csdn.net/z1106609486/article/details/52896205