如何使用C应用程序访问FreeDOS中的全部内存空间 [英] How can I access full memory space in FreeDOS with C application

查看:0
本文介绍了如何使用C应用程序访问FreeDOS中的全部内存空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我已经编写了一个简单的程序来调查(在一个循环中调用malloc(),直到返回空指针),虽然每个malloc()请求的大小对结果影响很小,但它总是在300kb左右。我的代码必须映射16位内存块,因为我的malloc()实现似乎只接受unsigned short参数。这并不可怕,因为我只需要3MB左右,也就是大约50个块(这是一个用于采集数据的循环缓冲区,所以这种绕过弯的方法并不那么麻烦)。由于我得到的内存远远超过16位内存(300K对64K),我知道这并不完全是16位内存的问题。我猜这与我在研究中读到的640kB的限制有关,但我不知道这是编译器问题还是操作系统问题。

我使用的是Borland BC5编译器,我尝试了对内存模型和编译器选项进行各种调整,但对结果的影响微乎其微。我目前正在研究HIMEMX.EXE和JEMM386.EXE,但由于到目前为止我遇到了这么多错误的树,所以我认为值得在此期间提出一个问题。我也开始研究Linux,尽管这是一个重大的变化,因为代码非常特定于DOS,而且我对Linux没有任何经验。

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

那么我应该更关注操作系统设置还是编译器设置(或编译器本身)?

推荐答案

特别是关于malloc(),我记得Borland实现采用16位大小参数。Borland库具有版本halloc()(以及相应hfree())的"巨大"内存模型,可以分配更大的块(大于64KB)。

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

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

DPMI程序在保护而不是实际模式下运行处理器。这有点复杂,因为有两种保护模式:16位80286保护模式(DPMI16)和32位80386保护模式(DPMI32)。在您的情况下,您只需关注DPMI32。

对于Borland编译器,DOS Power Pack工具支持DPMI。然而,Power Pack被设计用于Borland C++4.02和4.5x而不是5.0。This technical note,解释了如何在BC++5中使用Power Pack,但建议不要使用它。它声明它只能与命令行工具一起使用,而不能与IDE一起使用。这就是说other technical note然后解释了如何让它在IDE中工作,但解释了BC++5 RTL不能工作。总体而言,这听起来不是一次愉快的经历。

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

合适的工具链可能包括:

除DJGPP外,上述所有设备都需要第三方DOS扩展器(DPMI主机),其中一些列出了here。DJGPP包括一个扩展器(如here所述),因此可能是最简单的选择,如果不是最现代的(但Borland也不是)。请参考工具链文档以确定您需要什么。那些使用第三方扩展器的人的问题是,尽管编译器可能继续可用,但扩展器可能会消失(就像我认为Digital MARS的情况一样)。

这篇关于如何使用C应用程序访问FreeDOS中的全部内存空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆