最近总想分享点硬核的原创文章出来,一是硬核技术是一个程序员真正应该修炼
的内功;二是修炼硬核技能是通往架构师领域的必经之路。本系列文章将分享关
于linux内核设计原理相关的内容,希望能打通我们的七经八脉,真正领悟底层系
统设计的核心思想。关于linux内核之内存寻址相关的原理计划分享出三篇文章来讲解,此文为第一篇。
引言
所谓内存寻址,简单说来就是cpu接受到指令后需要从内存中取得相应数据,但是内存中的数据都是有对应地址的,需要通过地址来获取相应地址段上的数据,这也就是为什么要内存寻址。
所谓地址在操作系统中分为逻辑地址、线性地址、物理地址。
-
逻辑地址
逻辑地址其实就是机器码指令用到的地址,也就是机器指令码中用到的地址都是逻辑地址。目前这个地址是由16位段选择符和32位偏移量来表示的,这个地址也可叫做虚拟地址。 -
线性地址
是一个32位无符号整数,是由逻辑地址转换而来的。 -
物理地址
是内存芯片中的物理地址,是缓存数据的实际地址。是由逻辑地址转换而来的。最终是由这个地址来定位到内存空间。
实模式与保护模式
在8086处理器出现之前,内存地址的寻址方式是直接访问物理地址。在8086处理器中,了寻址1M的内存空间,把地址总线扩展到20位,但是ALU只有16位,也就是说如何用16位寄存器表示20位内存空间?为了解决这个问题,就产生了分段机制,也就是引入了4个段寄存器,es、cs、ds、ss,每个寄存器都是16位。8086处理器中逻辑地址格式为16位段寄存器地址:16位偏移地址,那么怎么用两个16位地