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. 如果数据在硬盘上(页面交换),触发"缺页中断",操作系统将数据从硬盘加载到内存,然后继续执行

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

  • 用户地址空间:用户态程序使用的虚拟内存区域区域
  • 内核地址空间:操作系统内核使用的虚拟内存区域
相关推荐
疯狂吧小飞牛3 小时前
GPG基础指令
linux·服务器·网络
C++ 老炮儿的技术栈3 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
todoitbo4 小时前
用虚拟局域网打通 Win/Mac/Linux 三端:跨设备协作的实用方案
linux·运维·macos
源远流长jerry4 小时前
RDMA 基本操作类型详解:从双端通信到单端直访
linux·网络·tcp/ip·ip
Sylvia-girl5 小时前
Linux下的基本指令1
linux·运维·服务器
wyt5314296 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
17(无规则自律)6 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
CDN3606 小时前
360CDN SDK 游戏盾:轻量化接入 + 强防护实测
运维·游戏·网络安全
Stewie121386 小时前
Docker 面试题
运维·docker·容器
星纬智联技术7 小时前
GEO E2E 自动化验证测试文章
运维·自动化·geo