运行时内存布局(Runtime Memory Layout)
大约 2 分钟
运行时内存布局(Runtime Memory Layout)
运行时内存的布局直接影响着我们如何生成代码,如何调试程序,更影响着我们生成代码的质量。因此,我们有必要深入了解一下运行时内存的布局。
现代操作系统的一大特点就是大量应用进程作为程序的执行单元。我们每个程序都拥有独立的虚拟地址空间,这使得本程序在运行时,不会和其他进程相互干扰。这种抽象的实现是通过操作系统的虚拟内存机制来完成的,这也大大简化了我们程序生成的难度。
内存布局
我们的程序在运行时,会被加载到内存中,这个时候,我们的程序会被分为几个部分:
- 代码段:存放我们的代码
- 数据段:存放我们的全局变量、常量、静态变量等。分为文字常量区、初始化数据区、未初始化数据区
- 堆:存放我们的动态分配的内存
- 栈:存放我们的局部变量、函数参数、返回值等
- 内核空间:存放操作系统的内核代码和数据,各个进程共享
- 共享内存映射:存放我们的共享内存映射区域,可根据配置来实现进程内存共享
而整个虚拟内存,则是由操作系统的多级页表来实现的。每个进程都有自己独立的页表,用来记录,虚拟内存空间的哪些部分被映射到了物理内存中。这样,我们的程序就可以使用虚拟内存,而不用关心物理内存的具体情况。而多级页表可以被MMU(内存管理单元)所支持,通过高效的硬件缓存结构,使得虚拟内存的访问速度和物理内存的访问速度相差没有很大。