如何使用C应用程序访问FreeDOS中的全部内存空间 [英] How can I access full memory space in FreeDOS with C application
问题描述
我有一个用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 32-bit DPMI port of GCC)
- Open Watcom v1.9
- Open Watcom v2 fork
- Digtal Mars (based on Symantec's compiler
- Orange C/C++
除DJGPP外,上述所有设备都需要第三方DOS扩展器(DPMI主机),其中一些列出了here。DJGPP包括一个扩展器(如here所述),因此可能是最简单的选择,如果不是最现代的(但Borland也不是)。请参考工具链文档以确定您需要什么。那些使用第三方扩展器的人的问题是,尽管编译器可能继续可用,但扩展器可能会消失(就像我认为Digital MARS的情况一样)。
这篇关于如何使用C应用程序访问FreeDOS中的全部内存空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!