首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码段和数据段背后的原理

代码段和数据段背后的原理
EN

Stack Overflow用户
提问于 2018-09-23 14:43:40
回答 1查看 763关注 0票数 1

将内存划分为代码段和数据段的基本原理是什么?我读到了一个来源,由于von-neumann架构指令和数据存储在同一位置,因此完成了这种分离。

但我想知道,由于指令和数据存储在同一位置,有必要将代码段和数据段分开,可能会导致什么问题?

为什么进一步深入到bss段、堆段和堆栈段?

EN

回答 1

Stack Overflow用户

发布于 2018-09-23 15:31:41

将程序分成代码部分和数据部分的最大好处之一是,它允许代码部分成为只读的,而数据部分可以保持可写。这可以防止程序意外地修改代码段,还允许在运行同一程序的进程之间共享代码段。

最近,只允许在代码段中执行代码的能力变得很重要。这是因为许多漏洞攻击都依赖于能够在代码段之外执行代码。分离代码和数据的另一个最近的好处是,如果代码和数据混合在一起,乱序的CPU最终可能会投机性地执行数据,从而导致较差的性能。

bss节作为数据节的扩展而存在。它包含所有初始化为零的程序数据。通过像这样分离零初始化数据,它允许bss部分实际上不被存储在程序的可执行文件中。两者都节省了磁盘空间并加快了加载速度。内存中的bss部分只是用零填充,而不是将其读取到内存中。

堆和堆栈的相似之处在于,它们都用于在程序运行时动态分配对象。这两者之间的区别是,堆上分配的对象可以随时释放,而放在堆栈上的任何东西只有在被移除后才能被移除。每次调用函数时,堆栈上的空间都会被分配给函数的参数、返回地址和局部变量。当函数返回时,这些内容将从堆栈中删除。几乎所有其他动态分配的东西都是在堆上分配的。

传统上,在Unix系统中,堆位于内存中bss部分之后,bss部分出现在代码和数据部分之后。当堆上的内容被分配时,它会向上增长,以便根据需要为它们腾出空间。堆栈被放在内存的末尾,并向下增长。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52463689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档