Memory 为什么是流程';s地址空间分为四段(文本、数据、堆栈和堆)?

Memory 为什么是流程';s地址空间分为四段(文本、数据、堆栈和堆)?,memory,process,operating-system,Memory,Process,Operating System,为什么进程的地址空间必须分成四个部分(文本、数据、堆栈和堆)?优势是什么?是否可能只有一个完整的大段?至少文本段和数据段是分开的,以防止运行存储在变量中的恶意代码 指令(编译代码)存储在文本段中,而变量的内容存储在数据段中,后者永远不会执行,只能从中读取和写入 更多信息。将程序拆分为内存中的部分有多种原因 其中之一是指令和数据存储器在体系结构上可以是不同的和不连续的,也就是说,在CPU内外使用不同的指令和电路进行读写,形成两个不同的地址空间(即,从地址0读取代码和从地址0读取数据通常会从不同的存

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

至少文本段和数据段是分开的,以防止运行存储在变量中的恶意代码

指令(编译代码)存储在文本段中,而变量的内容存储在数据段中,后者永远不会执行,只能从中读取和写入


更多信息。

将程序拆分为内存中的部分有多种原因

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

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

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

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


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

这难道不是一个大的、黑客式的解决办法,可以将安全性修补到数据和指令共享相同内存的冯诺依曼体系结构中吗?

堆栈和堆的增长/收缩也不同,因此必须分开。