mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
947 字
2 分钟
3.进程的地址空间
2026-06-22
2026-06-03

虚拟地址空间#

  • 地址空间的作用不是“真的给进程一大片 RAM”,而是给它一个连续、受保护、按页管理的虚拟地址视图。

  • 进程的最小可执行核心是:寄存器现场 + 虚拟地址空间。

  • MMU 根据页表把虚拟地址翻译成物理地址,并检查读/写/执行权限;非法访问通常会触发 page fault,最后可能变成 SIGSEGV

  • text:机器指令,通常只读、可执行。

  • rodata:字符串字面量、只读全局常量。

  • data + bss:已初始化/未初始化的全局变量、静态变量。

  • heap:动态分配区域;用户态常见接口是 malloc/new,底层常通过 brk/sbrkmmap 扩展。

  • mmap 区域:文件映射、匿名映射、共享库、JIT 代码、线程栈、vvar/vdso 等,现代进程里这块很重要。

  • 用户栈 stack:函数调用帧、局部变量、返回地址、保存的寄存器。

注意:

  • PC/RIP、通用寄存器不在栈里,也不在地址空间里;它们属于寄存器现场。
  • 一个 Unix 进程的完整状态还包括文件描述符、信号状态、调度信息、凭据、cwd、环境变量等;这些由内核维护,不是普通 load/store 能直接看到的内存。

fork 之后,子进程一开始看见的是父进程的整份地址空间;实现上常靠 Copy-on-Write,先共享物理页,写时再复制。

mmap munmap mprotect#

  • mmap 的本质不是“读文件 API”,而是“建立一段虚拟地址区间与某个后端对象之间的映射关系”。
  • 这个后端对象可以是文件,也可以是匿名内存;映射还会规定权限、共享/私有语义等。
  • 因而 mmap 更像“把文件当内存”,而 fprintf/fscanf 更像“把文件当流”。
  • 两者不是包含关系:fprintf/fscanf 擅长文本格式化与解析,mmap 擅长随机访问、共享、按页懒加载。
  • munmap/mprotect 是与之配套的常见接口,分别解除映射,修改权限。
  • mprotect 可以修改一段映射的权限,例如把页改成只读、不可访问、可执行等。
  • 某些调试/监视机制会利用这一点:先把目标页设成不可写,等程序写它时触发 page fault,再由调试器介入分析。

现代 OS 依赖按页懒分配、缺页装入、共享零页、文件页缓存、swap、overcommit 等机制,所以“映射成功”和“能把每一页都写满”不是一回事。

vvar / vdso#

  • vdso 是内核映射进用户地址空间的一小段用户态代码,用来加速某些原本常要陷入内核的操作,例如取时间。
  • vvar 是与之配套的一小段只读数据页,供 vdso 代码读取时钟基准等信息。
  • 可以粗略理解成:vdso 提供“代码”,vvar 提供“数据”;它们让一些操作在用户态就能完成,减少 syscall 开销。

入侵地址空间#

  • game genie:外接设备,在游戏启动前扫描并修改变量(外挂)
  • 葫芦侠修改器:每次变量发生变化,扫描地址空间,确定是哪一个变量,进而实现破解
  • 透视:将人物的三角形放在障碍物的三角形上面
  • 变速齿轮:劫持关于时间的系统调用
  • dma:将游戏内的数据向外拷贝
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

3.进程的地址空间
https://katyusha-blog.com/posts/nju-os/os/virtualization/address/
作者
katyusha
发布于
2026-06-22
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录