您的位置:首页 > 运维架构 > Linux

对Linux内存地址转换、保护模式的理解

2014-03-21 11:17 330 查看
相关概念:实模式、保护模式、GDT、LDT、物理地址、逻辑地址、线性地址(虚拟地址)

实模式

Intel 80286时代使用的模式。访问內存是通过segment:offset找到內存的。即“左移4位加偏移”,segment<<4+offset = 物理地址

保护模式

如今大部分的x86操作系都在保护模式下运行。内存的管理模式分为两种,段模式和页模式

访问一个内存地址仍然使用Segment:Offset的方式,segment是32位地址。

段模式提供了保护机制,其中每个段都会有一个数据结构叫段描述符,即[Base Address, Limit, Access]。每个段描述符的长度是8字节,含有3个主要字段:段基地址、段限长和段属性。

GDT(Global Descriptor Table)

GDT是保护模式下关键的一个数据结构。GDT是一个数组,存放在内存的某一个位置上,数组中存放了所有的段描述符。因为每一个进程都需要用到它,所以它是对所有进程可见的。

CPU必须知道GDT的入口,也就是它放在哪里,CPU提供了一个寄存器GDTR(段描述符寄存器)用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入GDTR寄存器,从此以后,CPU就根据GDTR中的内容作为GDT的入口来访问GDT了。

LDT(Local Descriptor Table)

它也是段描述符,但是它是某一个进程专有的。LDT的入口存在则在LDTR寄存器中。

段寄存器

段寄存器只有16位,其中存放的是段描述符在GDT或LDT内的索引值(index)。(注意区别段寄存器和段描述符寄存器,前者用来找某一个段描述符的位置,后者用来找整个GDT的位置)

物理地址

内存单元的地址,内存是一个线性的存储空间,每个内存单元按地址从小到大排列着。CPU通过这个地址直接访问地址对应的单元的数据。

逻辑地址

实模式下的那种地址就是逻辑地址。它是机器指令里出现的内存地址。段选择符(16位) + 偏移量(32位) = 逻辑地址

段选择符

段选择符用16位来表示。最高13位表示要使用的段在描述符表中的索引号,低3位的前两位表示使用段的权等级,最后1位指明描述符是位于GDT中还是位于LDT中(=0表示用GDT,=1表示用LDT)。段选择符用于逻辑地址向线性地址的转换,段描述符在GDT或LDT内的相对地址是由段选择符的最高13位的值乘以8(因为每个描述符8字节)得到的。

 

线性地址(虚拟地址)

线性地址就是对于某个进程自己地址空间的地址了。

三种地址的转换流程

机器指令中出现的内存地址是逻辑地址,需要转换成线性地址,再经过MMU转换成物理地址才能够被访问到。

逻辑地址-线性地址转换可以看做是对过去的兼容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: