让我们回到 70 年代和 80 年代。使用实模式平面内存模型,程序可以完全控制 64K 内存。这意味着,在 DOS 启动它之后,该程序可以覆盖 DOS 所在的内存,以及任何其他程序。
既然如此,那么程序退出后,DOS 如何能够“返回”呢?
答案1
首先,最初的 IBM DOS 于 1981 年随最初的 IBM 5150 PC 发布,尽管它所基于的 CP/M 操作系统在 70 年代确实存在。
我认为最好的描述方式是 DOS 将其主内存(“临时程序区”或 TPA)视为堆栈。
通常,第一个加载的程序是 COMMAND.COM,它位于底部。COMMAND.COM 可以要求 DOS 加载并将控制权交给另一个程序 - 二进制文件被放置在 COMMAND.COM 结束的内存中。我想 DOS 为此维护了一个“空闲内存开始”指针。当二进制文件执行 DOS 终止调用时,DOS 会减少空闲内存指针,然后“回收”内存。
由于您一次只运行一个程序,因此不必担心该方案中存在漏洞或碎片。
DOS 确实支持 TSR,即终止并驻留的程序。因此在这种情况下,DOS 在返回之前不会减少该指针,程序将保留在内存中。没有专门的第三方实用程序来移除它。TSR 可以挂接到 DOS 函数或系统中断中,从而实现有限的多任务处理。维基百科关于 TSR 的文章提供更详细的信息。
但是,是的,没有内存保护,因此任何程序实际上都可以随时破坏整个 RAM,包括 DOS 所在的位置。在这种情况下,执行 DOS 返回调用将崩溃或行为不可预测。此方案依赖于程序协作,并且没有强制执行。您甚至可以完全覆盖 DOS,这就是程序所做的LOADLIN
- 它是 DOS 的 Linux 加载器。我认为 Netware 也是这样,它使用 DOS 进行启动,但基本上 Netware OS 在加载时会替换 RAM 中的 DOS。