【问题标题】:How does DOS load a program into memory?DOS如何将程序加载到内存中?
【发布时间】:2011-04-12 13:14:20
【问题描述】:

MS-DOS 采取哪些步骤将 COM 或 EXE 文件加载到内存中?网上是否还有关于这是如何发生的参考资料?我能想到的最好的可能是指 dosbox 源。

【问题讨论】:

标签: executable dos


【解决方案1】:

当 command.com 被要求执行一个 .com 或 .exe 文件时,它会调用中断服务 21h/AH=4B,即 EXEC 服务。由调用程序决定:

  • 建立一个DOS EXEC参数块(见http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html) (包括有关环境变量、命令行参数、FCB 和返回时寄存器值的信息)
  • 释放调用程序未使用的所有内存
  • 设置调用参数寄存器
    • ah = 4Bh('EXEC' 服务类型)
    • al = 00h('加载和执行'函数)
    • ds:dx -> 程序名称
    • es:bx -> ptr 到 exec 参数块
  • 调用中断 21h
  • 在返回时重置堆栈指针并测试错误。

当中断 21h 被调用时(这对我来说是模糊的):

  • 分配了一个页面对齐的内存块
  • 文件扩展名被忽略,DOS 将检查前两个字节 如果是 EXE,则文件的签名为“MZ”或“ZM”,而对于 COM,则没有签名。

对于 exe:

对于 com:

  • 将整个 .com 文件复制到内存中
  • 设置寄存器值
    • AL,AH 盘符状态
    • CS,DS,ES,SS -> PSP 段
    • SP = 第一个 64k 段中可用的最后一个字的偏移量
  • 跳转到 IP=100h

程序现在应该正在执行。


注意事项:

在 Microsoft 的 KB 文档“定位可执行文件的优先顺序”中,它提到了 使用“MS-DOS EXEC 功能(中断 21h 服务 4Bh)”来执行 .com 和 .exe 文件 http://support.microsoft.com/kb/35284

所以我们可以查看 Ralph Brown 在 Int 21/AH=4Bh 上的中断列表

以及使用示例:

和dos exe头格式:

(这是基于一些谷歌搜索,所以请随时添加建议)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    相关资源
    最近更新 更多