1、Linux内存空间
a. Linux的内存空间有4G的进程地址空间,包括用户空间与内核空间。用户空间分配了3G,而内核空间分配了1G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。只有用户进程进行系统调用的情况下(代表用户进程在内核态执行),才能够访问到内核空间。
b.用户空间对应进程,所以每当进程切换,用户空间就会跟着变化。而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。
c.为了保护数据的安全,每个进程的用户空间都是完全独立、互不影响。
2、Linux内存空间分布图
3、各个地址空间的数据
栈:保存局部变量、函数形参、自动变量。
堆:保存由malloc、ralloc、calloc分配空间的变量。
bss段:保存未初始化或初始化为0的全局变量。
rodata段:在全局数据里保存常量。
data段(静态数据区):保存初始化不为0的全局变量或者static修饰的变量。
代码段:保存代码。
4、各地址空间的特点
栈:栈的权限是由系统决定的。数据具有先进后出、后进先出的特点。如果定义了一个未初始化的局部变量,那么它的值是一个随机值。
堆:堆的权限是由用户决定的,用户通过malloc、rolloc、calloc分配地址空间,并使用free()函数能够释放空间。数据具有先进先出、后进后出的特点。
bss段:如果定义了一个未初始化的全局变量,那么它的值为0。
rodata段:保存常量,常量的值是不允许被修改的。
data段:如果定义了一个未初始化的静态全局变量,那么它的值为0。
代码段:保存代码。
本文介绍了Linux内存空间的分配情况,包括3G的用户空间和1G的内核空间。用户进程只能访问用户空间,系统调用时才能访问内核空间。每个进程的用户空间独立,内核空间固定。此外,文章还详细阐述了栈、堆、bss段、rodata段、data段和代码段等不同地址空间的数据及特点。

179

被折叠的 条评论
为什么被折叠?



