linux---内存分区(代码段text、BSS、数据区data、栈stack、堆heap)

曼哈顿结构和冯诺依曼结构

哈弗结构:代码和数据分开存储,具有较高的执行效率(代码段只读)

冯诺依曼结构:代码和数据合并在一起(即代码段可写)

linux内存分布:

1、Text(代码区):二进制,只读
2、Bss(静态区or全局区):
		未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小
3、Data(数据段/静态存储区):存放初始化(普通+静态)全局变量和(全局 + 局部)静态变量
		因为字符串常量很少需要修改,放在静态内存区会提高效率
		//BSS由数据段衍生出去
4、Stack:局部变量
5、Heap:new/delete和malloc/free
		
其中Stack和Heap的内存增长方向是相反的

在这里插入图片描述
进程的虚拟地址空间图示如下:
在这里插入图片描述

代码段:

又称为文本段。存储可执行文件的指令;也有可能包含一些只读的常数变量,例如字符串常量等。

.rodata段:

存放只读数据,比如printf语句中的格式字符串和开关语句的跳转表。也就是你所说的常量区。例如,全局作用域中的 const int ival = 10,ival存放在.rodata段;再如,函数局部作用域中的printf(“Hello world %d\n”, c);语句中的格式字符串"Hello world %d\n",也存放在.rodata段。
 但是注意并不是所有的常量都是放在常量数据段的,其特殊情况如下:
  1)有些立即数与指令编译在一起直接放在代码段。
  2)对于字符串常量,编译器会去掉重复的常量,让程序的每个字符串常量只有一份。
  
在这里插入图片描述

在进程被载入内存中时,基本上被分裂成许多小的节(section)。我们比较关注的是6个主要的节:
(1) .text 节
(2).data 节
(3).bss 节
(4) 堆节
(5) 栈节
(6)环境/参数节
 环境/参数节(environment/arguments section)用来存储系统环境变量的一份复制文件,
进程在运行时可能需要。例如,运行中的进程,可以通过环境变量来访问路径、shell 名称、主机名等信息。
该节是可写的,因此在格式串(format string)和缓冲区溢出(buffer overflow)攻击中都可以使用该节。
另外,命令行参数也保持在该区域中。

猜你喜欢

转载自blog.csdn.net/qq_42024067/article/details/104670921