:从实模式到分页——处理器内存管理的发展史)
核心结论TL;DR实模式808616位寄存器通过“段基址左移4位偏移量”拼接出20位地址最大寻址1MB。保护模式80386引入 GDT全局描述符表和段选择子。为了安全加入了 Ring 0 ~ Ring 3 特权级。平坦模型因为 32 位寄存器可以直接寻址 4GB操作系统干脆把段基址全设为 0只靠偏移量寻址名义上还保留段机制实则已经“废掉”了分段。分页机制为了解决内存碎片问题将内存划分为 4KB 的页配合页表实现虚拟内存映射。CPU 中拿到的地址永远是虚拟地址。一、 探索起源8086 与实模式早期的 8086 处理器是 16 位的但地址总线是 20 位能寻址 1MB 空间。16 位寄存器怎么表示 20 位的地址呢Intel 发明了“段基址 段内偏移”的模式物理地址 段基址 4 段内偏移这种方式被称为实模式。虽然解决了寻址问题但存在严重的安全隐患——用户程序可以直接访问操作系统的物理内存把系统搞崩溃。二、 走向安全保护模式与 GDT到了 80286/80386 时代引入了保护模式。全局描述符表GDT操作系统在内存里维护了一个数组记录了各个段的信息包括基地址、界限、权限等。段选择子CPU 寄存器里不再存段基址了而是存一个“索引”。通过索引去 GDT 查找真正的段描述符。特权级Ring分为 Ring 0内核态到 Ring 3用户态。低权限程序想访问高权限内存门儿都没有。三、 走向平坦分段机制的没落到了 80386寄存器和地址总线都变成了 32 位可以直接寻址 4GB。既然一个偏移量就能访问整个 4GB 空间分段机制就显得多余了。为了让老软件还能跑Linux 采用了平坦模式Flat Model把所有的段基址都设置为 0。所以所有的虚拟地址从 0 开始算起。四、 精细化管理分页机制Paging虽然有了分段但内存分配很容易产生“外部碎片”比如内存里总共有 30MB 空闲但不连续导致一个 30MB 的程序放不进去。于是引入了分页机制将物理内存切分为固定大小的页框4KB。将程序的虚拟地址切分为同样大小的页。通过页表把连续的虚拟页映射到不连续的物理页框上。这下不仅没有了外部碎片还顺带实现了“虚拟内存”把不常用的页换到磁盘上骗程序说内存无限大。