🤖 AI文章摘要 gemini-2.0-flash-lite

这篇文章介绍了虚拟地址空间的概念,强调每个进程使用独立的虚拟内存地址,并通过MMU映射到物理内存。内核空间映射到一块相同的物理内存,而不同进程通过PCB区分。文章还详细阐述了用户地址空间,包括环境变量区、命令行参数区、栈区(向低地址申请,大小固定,溢出导致崩溃)、内存映射段、堆区(向高地址申请,大小不固定,释放不当会导致内存泄漏)、BSS区(未初始化全局/静态变量,默认0)、DATA区(已初始化全局/静态变量)以及TEXT区(可执行代码、字符串字面值、只读变量)。

虚拟地址空间

  每个进程使用的内存地址是与物理内存地址无关的虚拟内存地址, 虚拟内存地址通过MMU映射到物理内存地址. 内核空间通过MMU映射到一块相同的物理内存中, 不同进程是通过PCB加以区分

内核地址空间

用户地址空间

用户空间通过MMU映射到不同的物理空间, 不同进程间是不可见的.

  • 环境变量区:
  • 命令行参数区:
  • 栈区(stack):
    • 存放除了全局变量和静态变量的区域. 栈区空间是向低地址方向申请的.
    • 大小固定由内核决定, 栈溢出会导致程序崩溃.
    • 堆区很小, 结构体等大数据一般往堆区存放.
  • 内存映射段: 存放
  • 堆区(heap):
    • 堆区也成为动态存储空间, 需要动态申请与释放. 堆区空间是向高地址方向申请的.
    • 大小不固定, 由计算机内存决定, 若数据没有被释放, 系统会一直保留, 直到程序结束.
    • 若堆区地址丢失会导致内存泄漏, 经常内存泄漏会导致程序占用内存较大的情况
  • BSS区: 存放未初始化的全局变量和静态局部变量, 未初始化的变量自动初始化为0.
  • DATA区: 存放已经初始化的全局变量和静态局部变量
  • TEXT区: 存放可执行代码、字符串字面值、只读变量
  • 保留区: