对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
- 对Linux内存地址转换、保护模式的理解
- 对保护模式及模式及其之间的转换的进一步理解
- 实模式及保护模式下的地址转换
- 保护模式逻辑地址,线性地址转换
- ----[x86保护模式] CPU合成内存地址的方式----
- 我对保护模式的寻址方式的理解
- 自己对保护模式下的描述符的理解
- 我对保护模式下CPL,DPL,RPL 的理解
- linux对i386保护模式的选择性使用
- 对Linux内存管理的整体理解
- 保护模式的 A20地址线问题
- 80x86的保护虚地址模式
- 对iOS图片保护的理解
- (转载) 我对保护模式下CPL,DPL,RPL 的理解
- linux内存管理-虚拟地址转换成物理地址的过程
- 对STM32 ADC单次转换模式 连续转换模式 扫描模式的理解
- 对STM32 ADC单次转换模式 连续转换模式 扫描模式的理解
- linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换
- NSString与NSArray,NSDictionary的转换
- java线程安全总结
- 黑马程序员 7k面试题 交通灯管理系统
- 软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比
- MongoDB入门简介
- 对Linux内存地址转换、保护模式的理解
- Android 获取话筒声音波动
- 第三周作业
- 复选框批量删除
- mtk lcd调试问题总结
- 史上最全的iOS面试题及答案
- ssh远程登录失败"Write failed:Broken pipe"
- OpenHW12手记--Qt网络服务(TCP UDP)的建立与使用
- 黑马程序员7k面试题 银行业务调度系统