文章目录
article
虚拟内存地址
AI文章摘要
gemini-2.0-flash-lite
这篇文章介绍了虚拟地址空间的概念,强调每个进程使用独立的虚拟内存地址,并通过MMU映射到物理内存。内核空间映射到一块相同的物理内存,而不同进程通过PCB区分。文章还详细阐述了用户地址空间,包括环境变量区、命令行参数区、栈区(向低地址申请,大小固定,溢出导致崩溃)、内存映射段、堆区(向高地址申请,大小不固定,释放不当会导致内存泄漏)、BSS区(未初始化全局/静态变量,默认0)、DATA区(已初始化全局/静态变量)以及TEXT区(可执行代码、字符串字面值、只读变量)。
虚拟地址空间
每个进程使用的内存地址是与物理内存地址无关的虚拟内存地址, 虚拟内存地址通过MMU映射到物理内存地址. 内核空间通过MMU映射到一块相同的物理内存中, 不同进程是通过PCB加以区分
内核地址空间
用户地址空间
用户空间通过MMU映射到不同的物理空间, 不同进程间是不可见的.
- 环境变量区:
- 命令行参数区:
- 栈区(stack):
- 存放除了全局变量和静态变量的区域. 栈区空间是向低地址方向申请的.
- 大小固定由内核决定, 栈溢出会导致程序崩溃.
- 堆区很小, 结构体等大数据一般往堆区存放.
- 内存映射段: 存放
- 堆区(heap):
- 堆区也成为动态存储空间, 需要动态申请与释放. 堆区空间是向高地址方向申请的.
- 大小不固定, 由计算机内存决定, 若数据没有被释放, 系统会一直保留, 直到程序结束.
- 若堆区地址丢失会导致内存泄漏, 经常内存泄漏会导致程序占用内存较大的情况
- BSS区: 存放未初始化的全局变量和静态局部变量, 未初始化的变量自动初始化为0.
- DATA区: 存放已经初始化的全局变量和静态局部变量
- TEXT区: 存放可执行代码、字符串字面值、只读变量
- 保留区: