Watcom C 的笔记2 Watcom C (2)
WatcomC + DOS4GW 非常郁闷,在网上查了好久如何使用 Watcom C 访问 4G 内存,无果。 自己也在试验,从资料上看 Watcom C 自带的 Dos4GW 版本是 1.97,只能 访问 32MB内存 (http://www.tenberry.com/dos4g/watcom/4gwtable.html) 我编写了一个程序来验证如何访问,一直没有成功。 最终发现是我的程序写错了,试验是否有32MB限制,结果是“没有!”; 再试验是否有64MB限制,结果还是是“没有!”(试验的方法是用其他dos工具 向这个内存位置写值,如果能够读取出来,就是没有限制,如果有限制,则应该是 一个回转到 0MB的地方)最后试验直接读取4G的位置,那里有BIOS信息。哭死, 居然读出来了,就是说我前面的工作都是白费的,这个编程工具在DOS下根本就没 有内存方面的限制! memtest.c #include <stdio.h> int main() { unsigned long int address=4*1024*1024*1024-256; unsigned char *data; unsigned int i; for (i=0;i<0x100 ;i++ ) { data=(unsigned char*)(address); printf( "%c",*data); if ((i+1) % 16 ==0) {printf("\n");} address+=1; } return( 0 ); } //后面要记得留一个空行 使用 comp memtest.c 编译运行,运行结果会出现 0AAA000 等字样。 下面是使用工具dump 4G的结果,可以看出就是这个样子的: 0D 00 00 00 00 00 00 00 00 00 00 00 00 24 42 54 53 ............$BTS 0E 30 41 41 41 41 30 30 30 20 07 12 04 08 07 08 00 0AAAA000 ....... 0F EA AA FF 00 F0 31 32 2F 30 34 2F 30 37 00 FC 00 .....12/04/07... 在 XP 下面编译运行了一次,结果是崩溃的,想必如此。 DPMI (DOS Protected Mode Interface) 是保护模式的DOS扩展器和实模式的DOS 之间的接口。 总结:如果一个问题在网上没有人问,那么它肯定不是一个问题。 2008-1-8