内存管理是操作系统的核心技术之一,主要完成:由虚拟地址映射为物理地址,保证程序运行的隔离,及内存资源的高效分配等。
大致的演化为:物理地址-分段-分页-段页;
分段管理
这里的段是指程序运行过程中需要的内存段,并没有固定的大小限制,段的大小与程序本身有关。
映射方式为: 起始地址+偏移地址
Intel微处理器支持两种不同的分段模式:实模式分段管理与保护模式分段管理
- 实模式分段管理
Intel微处理器在实模式使用20条地址线寻址1MB物理存储器。
8086/8088仅有20条地址线A19-A0;(x86-16)
80286使用24条地址线中的20条;(x86-16)
80386、80486和Pentium也仅使用32条地址线中的20条。(x86-32/IA-32)
物理地址=段地址(段寄存器16bits)*0x10 + 偏移地址(16bits)
-
保护模式分段管理
为解决实模式下的内存访问权限管理和可能产生内存访问越界的问题引入,将内存段通过段描述符进行保护。
保护模式下,段的起始地址不再由段寄存器指示,而是保存在一个8字节的段描述符里,IA-32的段描述符结构如下:
其中包含:
- 32位段基址(段起始地址);
- 20位段界限;
- G位:界限粒度(G=1,段界限*4k,可访问4G空间,G=0,段界限本身)
- D位:D=1,32位指令模式;D=0,16位指令模式。
映射方式: 物理地址=段地址(段描述符表基址寄存器+段寄存器索引)+偏移地址
解决了对于内存访问权限控制的问题
分页管理
由于程序的局部性原理,加之段管理,内存粒度较大,每次换入换出都是整个程序,效率较低,引入粒度较小的分页管理机制。
页表:虚拟页到物理页的映射,存有4字节的页描述符;
页目录:到页表的影视,存有4字节的页表描述符。
以32位计算机系统中,页的大小设置为4k为例:
D31-D22: 页目录索引
D21-D12: 页表索引
D11-D0: 页偏移地址
映射方式:页目录基址(专有寄存器)+页目录索引 -- 页表描述符
页表基址+页表索引 -- 页描述符
页基址+页内偏移 -- 物理地址
段页式管理
分段与分页管理的结合,物理内存等分成页,程序访问内存时,先经过分段管理部件转换为线性地址,然后再经过分页管理部件转换为物理地址。
兼有分段管理的内存访问权限控制与分页管理的粒度较小的优点,但需要多次查表。
更多内容可关注本人博客:老香椿(https://laoxiangchun.cn/)