32bit的linux系统内存分布
在32bit的linux系统,则每个运行的程序都会得到4G大小的内存空间,只不过每个程序得到的4G大小的内存都是虚拟内存,而物理内存才只有4G,物理内存是真实存在的,而虚拟内存是通过映射得到的。(如图所示一个程序有1M大小的物理内存,在运行之后会得到4G大小的虚拟内存空间。)
1、代码段:(1).text段:用于存储用户程序生成的指令。
(2).init段:用于存储系统初始化的指令。
注意:这两部分的属性是只读的,在程序运行之后代码段中的数据就不应该再被修改。在程序运行之前 代码段的内存空间就已经被内核计算完成。
2、数据段:(1).rodata段:被称为只读常量区,程序中的常量(整型常量、字符串常量)都是存储在该区域,对于 该区域的属性是只读的,当程序结束后该区域的内存会被释放。
(2).data段:用于存储程序中的已经被初始化的全局变量和已经被初始化的静态局部变量,另外注意初 始化的值不能为0!
(3).bss段:用于存储程序中未被初始化的全局变量以及未被初始化的静态局部变量以及初始化为0的 全局变量和初始化为0的静态局部变量。
3、堆内存:堆空间属于用户可以随意支配的内存,用户想要支配堆空间的内存的前提是需要向内核申请,可以通过库 函数malloc( )、calloc( )申请堆内存,注意堆空间需要用户手动申请以及手动进行释放,通过库函数free( )释放堆内存。堆内存属于匿名内存,只能通过指针访问!!!
注意:由于堆空间是由用户进行支配,所以用户申请成功之后,使用完成后需要及时释放堆空间,并且必 须手动释放,并且必须只能释放一次,如果不释放,则会导致内存泄漏! 另外,当把申请的堆内 存释放之后,则应该同样把指向堆内存首地址的指针的地址指向NULL!
4、栈空间:栈空间主要用于存储程序的命令行参数、局部变量、函数的参数值、函数的返回地址,当函数被调用期 间,内核会分配对应大小的栈空间给函数使用,当函数调用完成则栈空间就会内核释放。栈空间的内存存 储是随机值,所以用户得到栈空间之后,应该把变量进行初始化,目的是防止变量中存储的值是不确定 的。
注意:Linux系统中栈空间的容量是有限的,如果超过容量,则会发生栈溢出,导致程序出现段错误。
标签:初始化,释放,程序,存储,32bit,内存,linux,空间 From: https://www.cnblogs.com/lwj294/p/18214023