Binder 预备知识

虚拟内存与物理内存

为什么要引入虚拟内存机制?可以说,虚拟内存是现代操作系统的核心基石,它解决了如下几个问题:

  1. 内存容量限制:早期计算机的物理内存非常有限,程序可能需要的内存超过实际安装的物理内存。虚拟内存允许程序使用比物理内存更大的地址空间,通过将部分数据临时存储在硬盘上来扩展可用内存。
  2. 内存隔离与保护:如果多个程序直接访问物理内存,一个程序可能会意外(或恶意)修改另一个程序的数据,导致系统崩溃。虚拟内存为每个进程提供独立的地址空间,进程之间互不干扰。
  3. 简化编程:程序员不需要关心物理内存的实际布局、其他程序占用了哪些内存,或者如何避免冲突。每个程序都认为自己拥有完整、连续的内存空间,从地址 0 开始。
  4. 内存管理效率:物理内存可能是碎片化的,但虚拟内存可以将分散的物理内存块映射为连续的虚拟地址,使内存分配和使用更高效。

虚拟内存像是一种"幻术"。它让每个程序都以为自己独占整个的 4GB(32 位)或 256TB(64 位系统低 48 位是有效的寻址位数)。但实际上,物理内存是有限的、多程序共享的,甚至可能是不连续的。

虚拟内存的实现通常依赖于硬件支持和操作系统的协作。硬件通常是指 CPU 中的硬件组件 MMU(内存管理单元),在 x86 架构中,虚拟内存通过分页机制实现,将虚拟地址转换为物理地址。虚拟地址转换为物理地址的示意图如下:

图中虚拟地址侧面的箭头,以及页表中的虚拟地址表明,虚拟地址是从 0 开始的连续内存。但物理地址则是不连续的(进程 1 的虚拟地址 0、1 分别对应物理内存的 1、4;进程 2 虚拟地址 0、1 对应物理地址 2、3)。

工作流程:

  1. 程序所在的进程访问某个虚拟地址
  2. MMU 查找 Page Table(页表),将虚拟地址转换为物理地址
  3. 如果数据在物理内存中,直接访问
  4. 如果数据在硬盘上(页面交换),触发"缺页中断",操作系统将数据从硬盘加载到内存,然后继续执行

虚拟地址空间会被进一步划分为用户地址空间与内核地址空间:

  • 用户地址空间:用户态程序使用的虚拟内存区域区域
  • 内核地址空间:操作系统内核使用的虚拟内存区域
相关推荐
cnstartech7 小时前
esxi-vmware 虚拟机互相打开
linux·运维·服务器
mcdx8 小时前
bootm的镜像加载地址与uImage镜像的加载地址、入口地址之间的关系
linux
不知疲倦的仄仄8 小时前
第四天:Netty 核心原理深度解析&EventLoop、Future/Promise 与 Pipeline
linux·服务器·网络
dajun1811234568 小时前
模型输出偏见的量化与消减
运维
橘颂TA8 小时前
【Linux 网络编程】网络是怎么 “跑” 起来的?从协议入门到 TCP/ IP 模型的底层逻辑
linux·运维·服务器·网络
looking_for__8 小时前
【Linux】进程间通信
linux
oMcLin8 小时前
如何在 Oracle Linux 8.3 上通过配置 LVM 与 RAID 结合,提升存储系统的性能与数据冗余性
linux·数据库·oracle
Blossom.1188 小时前
大模型自动化压缩:基于权重共享的超网神经架构搜索实战
运维·人工智能·python·算法·chatgpt·架构·自动化
cuijiecheng20188 小时前
Linux控制台下git使用图形化界面进行文件对比
linux·运维·git