gpt4 book ai didi

memory - 为什么进程的地址空间分为四个段(文本、数据、堆栈和堆)?

转载 作者:行者123 更新时间:2023-12-02 06:31:41 25 4
gpt4 key购买 nike

为什么进程的地址空间必须分为四个段(文本、数据、堆栈和堆)?优点是什么?是否有可能只有一整个大段?

最佳答案

将程序分成内存中的多个部分有多种原因。

其中之一是指令和数据存储器在架构上可以是不同的和不连续的,即使用CPU内部和外部的不同指令和电路进行读取和写入,形成两个不同的地址空间(即从CPU读取代码)地址 0 和从地址 0 读取数据通常会返回两个不同的值(来自不同的存储器)。

另一个是可靠性/安全性。您很少希望程序的代码和常量数据发生变化。大多数情况下,发生这种情况是因为出现了问题(无论是在程序本身还是在其输入中,这可能是恶意构造的)。您想要防止这种情况发生并知道是否有人尝试。同样,您不希望可以更改的数据区域是可执行的。如果是,并且程序中存在安全错误,当恶意代码将其作为数据进入程序数据区域并触发这些安全错误(例如缓冲区溢出)时,程序很容易被迫执行有害的操作。

另一个是存储...在许多程序中,许多数据区域根本没有初始化或初始化为一个公共(public)预定义值(通常为 0)。当程序加载并即将启动时,必须为这些数据区域保留内存,但这些区域不需要存储在磁盘上,因为那里没有有意义的数据。

在某些系统上,您可能将所有内容都放在一个位置(部分/段/等)。这里一个值得注意的例子是 MSDOS,其中 .COM 风格的程序没有任何结构,只是它们的大小必须小于约 64KB,并且第一个可执行指令必须出现在文件的最开头,并假设其位置对应于 IP =0x100(其中IP是指令指针寄存器)。代码和数据如何在 .COM 程序中放置和交错并不重要,取决于程序员。

还有其他架构工件,例如 x86 段。同样,MSDOS 是处理它们的操作系统的一个很好的例子。 .EXE 风格的程序中可能有多个段,这些段直接对应于 x86 CPU 段、实模式寻址方案,其中通过称为段的 64KB 长“窗口”查看内存。这些窗口/段的位置与 CPU 段寄存器的值相关。通过改变段寄存器值,您可以移动“窗口”。为了访问超过 64KB,需要使用不同的段寄存器值,这通常意味着 .EXE 中有多个段(不仅可以是一个用于代码的段和一个用于数据的段,还可以是其中任一段的多个段)。

关于memory - 为什么进程的地址空间分为四个段(文本、数据、堆栈和堆)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7873579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com