New*_*bie 5 memory operating-system process
为什么进程的地址空间必须分成四个段(文本,数据,堆栈和堆)?什么是advandatage?是否可能只有一个完整的大部分?
将程序拆分为内存中的部分有多种原因.
其中之一是,指令和数据存储器可以是建筑上不同的和不连续的,即,读取和/写入到使用不同的指令和内部以及CPU的外部电路,形成两个不同的地址空间(即,从地址0读出的代码和从地址0读取数据通常将从不同的存储器返回两个不同的值.
另一个是可靠性/安全性.您很少希望程序的代码和常量数据发生变化.大多数情况下,当发生这种情况时,它会发生错误(无论是在程序本身还是在输入中,可能是恶意构造的).你想防止这种情况发生,并知道是否有任何尝试.同样,您不希望可以更改的数据区域可执行.如果它们存在并且程序中存在安全漏洞,则当恶意代码将其作为数据进入程序数据区并触发那些安全漏洞(例如缓冲区溢出)时,程序可能很容易被迫做有害的事情.
另一个是存储......在许多程序中,许多数据区域根本没有初始化或被初始化为一个公共预定义值(通常为0).当程序加载并即将启动时,必须为这些数据区保留内存,但这些区域不需要存储在磁盘上,因为那里没有有意义的数据.
在某些系统上,您可以将所有内容放在一个位置(部分/段/等).这里的一个显着的例子是MSDOS,在.COM式的节目有没有比他们要小于64KB左右大小和第一可执行指令必须出现在文件的最开始,并假设其位置对应于IP其它结构= 0x100(其中IP是指令指针寄存器).代码和数据如何在.COM程序中放置和交错是不重要的,取决于程序员.
还有其他架构工件,例如x86段.同样,MSDOS是处理它们的操作系统的一个很好的例子.其中的.EXE风格的程序可能有多个直接对应于x86 CPU段的段到实模式寻址方案,其中通过称为段的64KB长"窗口"查看内存.这些窗口/段的位置相对于CPU的段寄存器的值.通过更改段寄存器值,您可以移动"窗口".为了访问大于64KB一个更需要使用不同的段寄存器值和常指具有在.EXE多个段(可以是用于代码而不只是一个段,一个用于数据,而且多个段为它们中的).