代码之家  ›  专栏  ›  技术社区  ›  robisrob

如何使用c应用程序访问freedos中的全部内存空间

  •  0
  • robisrob  · 技术社区  · 7 年前

    我有一个用c编写的嵌入式应用程序,在486/386dx风格的处理器上运行在freedos上( http://www.dmp.com.tw/tech/vortex86dx )这台电脑有256MB的内存,但我似乎无法访问大部分内存。

    我写了一个简单的程序来调查 malloc() 在循环中,直到返回空指针),尽管每个 马洛克() 请求对结果的影响很小,总是在300KB左右。我的代码必须映射16位内存块作为 马洛克() 似乎只接受 unsigned short 争论。不可怕,因为我只需要3MB左右,所以大约50个块(这是一个循环的数据采集缓冲区,所以这种迂回的方法没有那么麻烦)。因为我得到了超过16位的内存(300k比64k),我知道这并不完全是一个16位的问题。我猜这与我在研究中读到的640KB限制有关,但我不知道这是编译器问题还是操作系统问题。

    我使用的是borland bc5编译器,我尝试过对内存模型和编译器选项进行各种调整,这些调整对结果的影响很小。我目前正在调查himmx.exe和jemm386.exe,但由于到目前为止我发现了很多错误的树,所以我认为这值得一问。我也开始研究Linux,虽然这是一个重大的变化,因为代码是非常特定于DOS的,我对Linux没有经验。

    我希望有一些设置或命令,我需要利用,而不必做一些巨大的端口和操作系统,我不熟悉。我的dos安装目前只包括将文件config.sys和sys.com复制到硬盘上,所以我还不能访问上面的扩展内存可执行文件进行实验。猜测这只会让我进入下一个困难,所以希望在这个古老部门有经验的人能帮忙,直到我有更多的时间熟悉现代工具。

    所以我应该更关注操作系统设置或编译器设置(或编译器本身)?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Clifford    7 年前

    特别是关于 malloc() ,我记得borland实现有一个16位大小的参数。Borland图书馆有一个“巨大”的记忆模型 halloc() (以及相应的 hfree() )它可以分配更大的块(大于64KB)。

    它是一个 扩展内存管理器 ,它将大于1MB的内存分页到大于640K的“高内存”区域中-该区域的大小仅为384KB,并非所有这些区域都可用于内存分页,这可能是您通过实验观察到的300KB限制的原因。

    为了充分利用代码和数据的内存资源,有必要使用dpmi(dos保护模式接口)。dpmi程序是一个真正的32位保护模式程序,具有访问dos api的机制(这是windows 3.x在windows 95本身成为操作系统之前的工作方式,而不是dos上的图形环境)。

    dpmi程序在中运行处理器 受保护的 而不是那时 真实的 模式。有两种保护模式:16位80286保护模式(dpmi16)和32位80386保护模式(dpmi32),这稍微有点复杂。在你的情况下,你只需要关心DPMI32。

    对于borland编译器,dpmi通过 DOS电源组 工具。然而,电源包设计工作与Borland C++ 4.02和4.5x,而不是5。 This technical note ,说明如何在BC++5中使用电源组,但建议不要使用。它声明它只适用于命令行工具,而不是IDE。上面写着 other technical note 然后解释如何在ide中工作,但是解释bc++5rtl将不工作。总的来说,这听起来不像是一次愉快的经历。

    然而,根本不需要考虑切换到Linux—您只需要使用支持DPMI32的工具链,并允许您在DOS环境中将代码构建为真正的32位代码。

    合适的工具链可能包括:

    除DJGPP外,上述所有内容均需要第三方 DOS扩展器 (dpmi主机)其中一些已列出 here . DJGPP包括一个扩展器(如前所述 here ,因此,如果不是最现代的话,这可能是最简单的选择。参考工具链文档以确定您需要什么。使用第三方扩展器的问题是,虽然编译器可能继续可用,但扩展器可能会消失(我认为Digital Mars就是这样)。

        2
  •  1
  •   glglgl John Dvorak    7 年前

    好的旧dos只设置为使用640kib内存,地址空间只增加到1 mib。

    新技术包括 "unreal mode" (这是我第一次听到,但在我看来是合乎逻辑的)。

    但是在dos时代,你必须使用ems和/或xms。

    这些是访问可用内存窗口之外的内存的技术。

    ems有内存窗口,可以在其中映射额外内存的页面。

    在xms中,有一个特殊的函数帮助您使用特定的函数地址将数据从内存复制到内存。