日期:2014-05-16  浏览次数:20585 次

Linux内存管理之分段机制

逻辑地址就是我们普通的段+偏移的表现方式,而线性地址就是段+偏移之后算出来的一个地址,前者可以认

为是二维的地址,而后者可以理解是一维的。线性地址和虚拟地址的概念相接近,不知道其根本的区别。而

物理地址就是实际在地址总线上传输的地址,也就是物理内存访问的真正地址。

如上图,Linux在内存管理上,把逻辑地址通过分段机制变化成线性地址,线性地址也就是4G(32位系统)

的程序地址。线性地址再通过分页机制转化成物理地址,最后CPU去访问物理地址。

去年写个一篇关于IA32内存寻址的文章,现在再重温下。下面是一张很好的内存寻址图

采用分段机制的好处就是方便了程序员的编码,把整个地址分成不同的数据段,代码段,数据段,堆栈

等等。每个段都是动态调整的,在程序重定向的时候。那么对于每一个段的基本信息:段的起始地址,

段的长度,段的访问权限等,都会保存在段描述表中(上面的GDT),GDT是存在物理内存中的。也就说

我们普通的程序执行一条指令的时候(比如C语言中的&操作),我们操作的是一个逻辑地址,逻辑地址必须

通过段机制转化成线性地址,而根据什么转化呢?就是GDT!GDT会告诉你在线性地址哪里到哪里是你的数