Operating system 什么决定了内存模型?

Operating system 什么决定了内存模型?,operating-system,computer-architecture,Operating System,Computer Architecture,具体来说,这个问题是关于真实模式中的平面和分段模型。我正在读一本关于汇编的书,书中提到在DOS上COM文件使用平面内存模型,EXE文件使用分段内存模型。然而,我不明白是什么告诉DOS使用哪种内存模型。我问这个问题是因为我正在阅读有关引导加载程序的书籍。COM和EXE可执行文件在文件头中有它们的内存要求:和。如果程序要求64KB,则使用分段内存。COM文件使用“平坦内存模型”,即当程序加载到指向同一段时,DOS将段寄存器全部设置,按照惯例,所有代码和指针,相对于段寄存器中的一个值 另一方面,EXE

具体来说,这个问题是关于真实模式中的平面和分段模型。我正在读一本关于汇编的书,书中提到在DOS上COM文件使用平面内存模型,EXE文件使用分段内存模型。然而,我不明白是什么告诉DOS使用哪种内存模型。我问这个问题是因为我正在阅读有关引导加载程序的书籍。

COM和EXE可执行文件在文件头中有它们的内存要求:和。如果程序要求<64KB,则使用平坦空间;如果>64KB,则使用分段内存。

COM文件使用“平坦内存模型”,即当程序加载到指向同一段时,DOS将段寄存器全部设置,按照惯例,所有代码和指针,相对于段寄存器中的一个值

另一方面,EXE文件格式允许以不同的偏移量加载段。DOS不会将段寄存器设置为默认值;这取决于代码本身。16位EXE代码要复杂得多,因为该代码必须管理段寄存器


现在很多EXE代码或多或少又忽略了段寄存器;32位或64位寄存器不需要添加到段寄存器以生成可用地址。

DOS中没有任何东西可以阻止COM文件使用分段内存模型,因为DOS在其应用程序上没有强制执行内存管理策略


您可以阅读wikipedia的条目,它提供了对这些旧问题的深入了解。

您能告诉我们,是什么让DOS在COM文件中设置段寄存器,而在EXE文件中保留段寄存器?是什么让DOS这样做的?这正是DOS代码所做的。我不知道如何回答你的问题:编程DOS的程序员告诉它这样做。DOS EXE格式除了CS:IP和SS:SP之外,没有任何设置寄存器的规定。如果有,程序员将不得不以某种特殊方式标记DS和ES的段,以及汇编程序,编译器和链接器需要以特殊的方式支持这种特殊标记的段。也许,人们认为这不值得。毕竟,在形式上,您的分段程序不必有任何数据段。最基本的是代码和堆栈段。实际上我想问的是DOS如何决定是否必须设置段寄存器。通过查看文件扩展名或头,DOS对文件名非常重视。仅三个字母的扩展名就可以确定文件是COM程序、EXE程序还是某种数据。EXE格式包含一个“神奇的数字”,但我敢肯定DOS甚至没有看它。