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

来源:互联网 发布:mac顶部菜单栏图标 编辑:程序博客网 时间:2024/06/06 05:57
相关概念:实模式、保护模式、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转换成物理地址才能够被访问到。

逻辑地址-线性地址转换可以看做是对过去的兼容。


0 0
原创粉丝点击