linux内存
1 内存寻址 1.1 物理地址、虚拟地址以及线性地址 物理地址: 物理内存的内存单元地址 虚拟地址: 程序员看到的内存空间定义未虚拟地址,intel X86 CPU寻址使用了段机制,最初的8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址,解决了CPU数据总线16位寻址20位数据地址空间的问题。 虚拟地址一般用“段:偏移量”的形式来描述,比如在8086中A815:CF2D就代表段首地址为A815,段内偏移位为CF2D的虚地址。 线性地址: 是指一段连续的,不分段的,范围为0到4GB的地址空间,一个线性地址就是线性地址空间的一个绝对地址。 寻址模式有2种: 实模式: 是 段地址+偏移量 的方式,得到物理地址;如当程序执行“mov ax,[1024]”这样一条指令时,在8086的实模式下,把某一段寄存器(比如ds)左移4位,然后与16位的偏移量(1024)相加后被直接送到内存总线上,这个相加后的地址就是内存单元的物理地址,而程序中的地址(例如ds:1024)就叫虚拟地址 保护模式:不 允许通过段寄存器取值得到段的起始地址,而是把虚拟地址转进一个 MMU 的硬件,经过额外的转换和检查,进而得到一个物理地址,如下图所示: 保护模式下寻址 MMU是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件