目录
操作系统管理内存的方式
虚拟地址通过页表映射到物理地址,那么虚拟地址是如何找到物理内存?
分段式
将虚拟地址空间进行分段,(代码段/数据段、堆、栈、参数、环境变量),根据使用一个空间的性质,在不同的分段,分配虚拟地址,有助于编译器的内存管理
虚拟地址的组成:段表 + 段内的偏移量
在操作系统中有一个段表,表中包含:虚拟段号、物理内存段起始地址
通过虚拟地址中的段号,在段表中找到相应的段表项,得到物理段的起始位置,在加上段内偏移量最终得到物理地址
分页式
虚拟地址的组成: 页号 + 页内偏移量 (页:一块内存段)
操作系统中有一个页表,页表中包含:虚拟页号、物理块起始地址、内存访问空控制、缺页中断位
通常在32位操作系统中,一个页表的大小为4096字节也就是4KB,则4G的内存空间就有1024*1024个页面,因此虚拟页号就占20个二进制位。
在十六进制中,若页表的大小是4096字节,则虚拟地址的高20位就是页号,低12位就是页内偏移量。
通过虚拟地址中的页号,找到页表中对应的页号项,通过页号项中对应的物理块起始地址+页内偏移量,得到在物理内存中对应的地址。
分页式内存管理实现了数据在物理内存上的离散式存储以及内存的访问控制
段页式
段页式是分段式和分页式的结合,它是在分段式的基础上,给分段内存都进行分页式管理(每个分段都有自己的页表)
虚拟地址的组成:段号 + 段内页号 + 页内偏移量
段页式内存管理需要通过段表和页表的一同使用,段表中包含:段号、段内页表的起始地址,页表包含:页号、页内偏移量
通过虚拟地址中的段号在段表中找到对应的段号项,通过段表中的段号项可以得到段内页表的起始地址(也就是这个分段对应的页表),在得到该段内存对应的页表后可以通过虚拟地址中的段内页号找到对应的页表项得到物理起始地址,加上虚拟地址中的页内偏移量就对应的物理地址