操作系统——虚拟内存和物理内存

虚拟内存

虚拟内存地址的作用:

  • 进程地址隔离

    操作系统为每个进程营造出一片独立的虚拟地址空间,使得进程与进程之间相互隔离,互不干扰的,解决了多进程同时运行时产生的内存地址冲突问题。

  • 保障内核安全

    虚拟内存还提供了系统安全方面的保障,会对进程访问内存的行为进行相关的安全权限检查,保障了系统的稳定性和安全性。

虚拟内存地址与物理内存地址是怎么映射的?

物理内存页:内核会将整个物理内存空间划分为一页一页大小相同的的内存块,每个内存块大小为 4K,称为一个物理内存页。

通过页表来管理虚拟内存和物理内存之间的映射关系,以及对物理内存的访问权限。操作系统专门划分了一页物理内存来作为页表。

单级页表

单级页表结构中,虚拟内存翻译成物理内存的过程是:

(1)页表(4KB)划分出大小相等的内存块,叫页表项PTE(Page Table Entry),PTE中保存了进程的虚拟页与物理页的映射关系,以及控制物理内存访问的相关权限位。在32位系统中PTE占用4B,在64为系统中占8B。

(2)进程的虚拟内存地址的格式为:页表内的偏移+物理内存页内的偏移。 页表相当于是PTE数组,页表内的偏移相当于PTE的索引。

(3)页表起始地址在创建进程时,写在了内核中,可以从CR3寄存器中获取。

地址翻译过程是:

想查看进程中某个字节的地址,先找到对应的PTE,公式为:页表起始地址+虚拟地址中页表内的偏移 * sizeof(PTE)。然后从PTE中拿到物理页的起始地址,然后用物理页起始地址+虚拟地址中物理内存页中的偏移,即可找到对应的物理内存地址。

多级页表

32位系统,单级页表中,一个PTE(4B)可以索引一个物理内存页(4K),一个页表(4K)中包含1024个PTE,也就是一个页表可以索引4M的物理内存。32位系统中,4G物理内存则需要1024张页表,也就是页表占用4M,而且是连续的4M内存空间(因为查找PTE是按照数据下标方式索引的),而每个进程都需要页表,也就是每个进程都需要4M的页表空间,对内存的占用比较多。

因此,可以建立多级页表。

以二级页表结构为例:

一级页表就是单级页表,用来直接索引物理内存页,一张页表可以索引4M的物理内存。

二级页表也叫页目录,用来索引一级页表,一张页目录(4K)可以索引4M的一级页表,即1024个一级页表,可以索引1024*4M=4G的物理内存。

在32位系统中,二级页表结构就能索引4G的内存空间。

地址查找的过程,变动点在:

(1)进程的虚拟地址格式为:页目录表中PDE的偏移+一级页表内中PTE的偏移+物理内存页内的偏移。

能使用多级页表进行内存空间优化,基于一个重要的思想:局部性原理。

程序局部性原理表现为:时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某块数据被访问,则不久之后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。

参考:mp.weixin.qq.com/s/FzTBx32AB...

相关推荐
噜~噜~噜~5 小时前
操作系统笔记-2.3.5.1.1生产者-消费者问题
笔记·操作系统
噜~噜~噜~10 小时前
操作系统笔记-2.3.5.2 读者-写者问题
笔记·操作系统
sulikey3 天前
Linux Core Dump 完全指南:从原理到实战的崩溃调试手册。什么是core dump?程序报错core dumped怎么办?
linux·服务器·操作系统·调试·coredump
chen<>4 天前
malloc 和 free 背后发生了什么?
java·linux·服务器·操作系统
charlie1145141915 天前
Cinux · musl 静态移植:对齐 Linux ABI、铺初始栈,以及一个被 SMAP 拦下的潜伏 bug
linux·开发语言·c++·操作系统·开源项目
布莱克6055 天前
软中断和硬中断的区别
开发语言·操作系统
噜~噜~噜~6 天前
操作系统笔记-2.3.2.1 进程互斥的软件实现方法
笔记·操作系统
冬奇Lab7 天前
开源项目第198期:Omarchy — DHH 打造的「意见鲜明」Linux 桌面系统
人工智能·开源·操作系统
噜~噜~噜~8 天前
操作系统笔记-2.2.6 多处理机调度
笔记·操作系统
拂拉氏10 天前
【Linux】 开发工具(Makefile、git、cgdb)解析与对于操作系统的基础认识
linux·git·操作系统·makefile·cgdb