博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux---内存分区(代码段text、BSS、数据区data、栈stack、堆heap)
阅读量:3918 次
发布时间:2019-05-23

本文共 982 字,大约阅读时间需要 3 分钟。

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

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

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

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)攻击中都可以使用该节。
另外,命令行参数也保持在该区域中。

转载地址:http://nbhrn.baihongyu.com/

你可能感兴趣的文章
浅析 EF Core 5 中的 DbContextFactory
查看>>
听说容器正在吃掉整个软件世界?
查看>>
真实经历:整整一年了,他是这样从程序员转型做产品经理的
查看>>
netcore一键部署到linux服务器以服务方式后台运行
查看>>
还在犹豫是否迁移.NET5?这几个项目已经上线了!
查看>>
被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?
查看>>
ASP.NET Core使用HostingStartup增强启动操作
查看>>
结合控制台程序和K8S的CronJob完成定时任务
查看>>
WPF开发的实用小工具 - 快捷悬浮菜单
查看>>
.Net orm 开源项目 FreeSql 2.0.0
查看>>
IdentityServer4系列 | 简化模式
查看>>
小试YARP
查看>>
如何使用 C# 中的 HashSet
查看>>
api-hook,更轻量的接口测试工具
查看>>
一个情怀引发的生产事故(续)
查看>>
如何在 C# 中使用 RabbitMQ
查看>>
一套标准的ASP.NET Core容器化应用日志收集分析方案
查看>>
如何使用 C# 扩展方法
查看>>
C#如何回到主线程,如何在委托指定线程执行
查看>>
服务器重新部署踩坑记
查看>>