代码段和数据段的基本原理

时间:2018-09-23 06:43:40

标签: assembly memory

将内存分为代码段和数据段的背后的原理是什么?我必须读一读资料,由于进行这种分离,因此冯·诺依曼体系结构的指令和数据存储在同一位置。

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

为什么还要进一步进入bss段,堆段和堆栈段?

1 个答案:

答案 0 :(得分:1)

将程序分为代码部分和数据部分的最大好处之一是,它允许代码部分为只读,而数据部分可以保持可写状态。这可以防止代码段被程序意外修改,还可以在运行同一程序的进程之间共享它。 最近,仅允许执行代码部分中的代码的能力变得很重要。这是因为许多利用依赖于能够在代码部分之外执行代码。分离代码和数据的另一个最近的好处是,如果代码和数据混合在一起,乱序的CPU可能最终会推测性地执行数据,从而导致性能变差。 bss部分作为数据部分的扩展存在。它包含所有初始化为零的程序数据。通过这样将零初始化数据分离出来,它可以使bss节实际上不存储在程序的可执行文件中。两者都节省了磁盘空间并加快了加载速度。内存中的bss部分仅填充零,而不是将其读取到内存中。 堆和栈的相似之处在于,它们都用于在程序运行时动态分配对象。两者之间的区别在于,可以随时释放分配在堆上的对象,而只有在删除堆栈上的所有内容之后,才能删除放在堆栈上的所有内容。每次调用一个函数时,都会在堆栈上分配空间,以存放诸如该函数的参数,返回地址和局部变量之类的内容。当函数返回时,这些东西将从堆栈中删除。动态分配的几乎所有其他东西都分配在堆上。 传统上,在Unix系统上,堆位于bss节之后的内存中,bss节位于代码和数据节之后。随着事物在堆上的分配,它向上增长以根据需要为它们腾出空间。堆栈放置在内存的末尾,并向下扩展。