Linux内存管理之分段机制
作者:网络转载 发布时间:[ 2012/11/26 15:54:52 ] 推荐标签:
逻辑地址是我们普通的段+偏移的表现方式,而线性地址是段+偏移之后算出来的一个地址,前者可以认为是二维的地址,而后者可以理解是一维的。线性地址和虚拟地址的概念相接近,不知道其根本的区别。而物理地址是实际在地址总线上传输的地址,也是物理内存访问的真正地址。
如上图,Linux在内存管理上,把逻辑地址通过分段机制变化成线性地址,线性地址也是4G(32位系统)的程序地址。线性地址再通过分页机制转化成物理地址,后CPU去访问物理地址。
去年写个一篇关于IA32内存寻址的文章,现在再重温下。下面是一张很好的内存寻址图
采用分段机制的好处是方便了程序员的编码,把整个地址分成不同的数据段,代码段,数据段,堆栈等等。每个段都是动态调整的,在程序重定向的时候。那么对于每一个段的基本信息:段的起始地址,段的长度,段的访问权限等,都会保存在段描述表中(上面的GDT),GDT是存在物理内存中的。也说我们普通的程序执行一条指令的时候(比如C语言中的&操作),我们操作的是一个逻辑地址,逻辑地址必须通过段机制转化成线性地址,而根据什么转化呢?是GDT!GDT会告诉你在线性地址哪里到哪里是你的数据段,哪里到哪里是代码段。那么我们怎么找到GDT呢?GDT是在内存里的,这用到寄存器GDTR了,GDTR会告诉你GDT在内存的起始位置,然后可以去问GDT我要访问的逻辑地址所对应的线性地址是什么。再深入点,上面说的了GDT里面是描述每个段的基本信息的,其中是每个段在线性地址里对应的起始位置。
GDT里面存的是各个段的索引,叫做段选择子(Seg.Selector),现代计算机为了减少对内存访问的次数,把段选择子存于我们平时说的CS寄存器,DS寄存器等,这样,一个逻辑地址到线性地址的转换大大地加快了。
现在完整地说一遍上面分段的整个流程,对于一个逻辑地址(段:偏移),首先通过GDTR找到GDT,GDT里面是段选择子,直接从段寄存器获得,通过段选择子找到该段在内存里的基地址,然后加上逻辑地址的偏移部分,这完整地得到了一个线性地址。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11