Linux内存空间的分配
2016-07-11 11:00
381 查看
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。
代码段:保存代码。
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。
代码段:保存代码。
相关文章推荐
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- JavaScript实现显示函数调用堆栈的方法
- 关于PHP堆栈与列队的学习
- JavaScript调用堆栈及setTimeout使用方法深入剖析
- Go语言的队列和堆栈实现方法
- Android调用堆栈跟踪实例分析
- WindowManagerService服务是如何以堆栈的形式来组织窗口
- JS实现队列与堆栈的方法
- JavaScript把数组作为堆栈使用的方法
- JavaScript数组实现数据结构中的队列与堆栈
- Python记录详细调用堆栈日志的方法
- python实现堆栈与队列的方法
- Go语言用map实现堆栈功能的方法
- 深入JVM剖析Java的线程堆栈
- Java使用Deque实现堆栈的方法
- 程序的内存分布
- C 堆栈,运行时类型挷定
- JavaScript实现显示函数调用堆栈的方法
- 关于“堆栈”