一.进程中的内存分布
进程是应用程序运行的单位,进程在内存中运行时,各个部分分布的情况如图。
1.栈内存(statck)
特点:后进先出
系统一般会对栈的大小进行限制,可以用命令进行查看,如下,700是进程号,栈被限制为8M。
# cat /proc/700/limits
Limit Soft Limit Hard Limit Units
Max stack size 8388608 unlimited bytes
栈存储的内容:
(1)环境变量
(2)命令行参数
(3)局部变量
(4)函数
另外我们需要一个较大的内存作存储时,不能分配栈内存,栈的空间有限
2.堆内存
堆是动态内存,是由用户进行分配和管理
内存相关函数
申请:malloc() / calloc() / realloc()
释放:free()
3.数据段
(1)
.bss:存放未初始化的静态数据
static修饰的变量和全局变量
(2)
.data:已存始化的静态数据
(3)
.rodata:放常量
4.代码段
(1).text
存放用户程序代码
(2).init
环境变量的准备、命令行参数的组织和传递等
二.linux虚拟内存
linux中是多个进程一起运行,每一个进程均要使用内存,如何保证这些进程可以不互相干扰的使用内存,操作系统提出了相关的解决方案,既虚拟内存。
我们在现实中看到了内存,是电脑的内存条,如下图
假如这个内存条是1G。
针对32位系统而言,系统地址总线最大能访问的内存空间是4G,为了不浪费地址总线的能力,每一个C语言进程都拥有一个大小为4G的虚拟内存。
1G的物理内存如何与多个进程对应的多个4G的虚拟内存建立联系?并且让进程正常运行。
一般一个进程运行时,并非此进程中所有的作业都要放入内存,可以将程序的一部分装入内存,而其余部分保留在外存,当所要执行的部分不在内存时,将要执行的部分从外存导入内存,而将长期不执行的部分从内存导出至外存并腾出内存空间。
上述的导入和导出操作的最小空间单位在虚拟内存中叫页,在物理内存中叫页框,页和页框太小一样,均为4KB
这样既可以实现多个进程同时在物理内存上运行,互不干扰并且也实现了系统运行所需内存比物理内存空间还大的进程。
页和页框是有对应关系的,这种对应关系就叫页表。
页表的作用是实现逻辑空间向物理空间的转换。如下图
一个页或者页框大小是4KB,地址所在的页号+在此页的偏移量既为逻辑地址。对应的物理地址为对应的地址序号+偏移量,逻辑地址和物理地址的偏移量是一样的,因而页表所包含的映射关系仅仅是逻辑地址所在页面和物理地址所对应序号的关系。这种对应关系的翻译靠MMU完成。
关于linux多级页表的具体实现,本节暂不加以描述。后面专门找一节作深入研究。