32位程序内存最大访问地址问题

时间:2022-09-06 03:32:12
各位大虾,
        遇到一个问题,win2008/win7 64位操作系统上运行32位的程序,内存最大访问地址仍然存在2GB限制。。。
        想问下通过配置什么参数可以去除这个限制。原来网上说的改boot.ini /3gb选项,现在boot.ini已经找不到了。。

16 个解决方案

#1


重新编译为64位程序。

#2


引用 1 楼 go_and_see 的回复:
重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。

#3


引用 2 楼 lingjl2012 的回复:
Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


只能是重新编译吧。32位程序是运行在64位系统中的32位子环境中的。

#4


引用 2 楼 lingjl2012 的回复:
Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


编译器比较老,是VC6吗?VC6的代码甚至都不用改,可以用VS2005编译成64位的,注意for循环的设置,忘记VS2005在哪里设置了。VC6和VS2005的区别,也就是for循环了,其他问题不大。我们公司不少代码也是VC6改来的,没问题,尝试一下吧。

32位程序最多只能访问那么多内存了,没办法的。

#5


在链接器选项中加上/LARGEADDRESSAWARE,可以增加到接近4GB,另外,64位系统中不需要设置boot.ini。

#6


使用LARGEADDRESSAWARE选项链接的32位应用程序,在32位windows里可以访问3G内存,在64位windows里可以访问4G内存,再多就只能编译成64位了。

#7


引用 4 楼 go_and_see 的回复:
Quote: 引用 2 楼 lingjl2012 的回复:

Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


编译器比较老,是VC6吗?VC6的代码甚至都不用改,可以用VS2005编译成64位的,注意for循环的设置,忘记VS2005在哪里设置了。VC6和VS2005的区别,也就是for循环了,其他问题不大。我们公司不少代码也是VC6改来的,没问题,尝试一下吧。

32位程序最多只能访问那么多内存了,没办法的。


这个程序是在bcb6中编译的, 比较坑爹呢。

#8


引用 6 楼 movsd 的回复:
使用LARGEADDRESSAWARE选项链接的32位应用程序,在32位windows里可以访问3G内存,在64位windows里可以访问4G内存,再多就只能编译成64位了。


大神,知不知道bcb6有没有类似的链接选项呢。。

#9


引用 7 楼 lingjl2012 的回复:
这个程序是在bcb6中编译的, 比较坑爹呢。


BCB不懂,只能帮顶了。

#10


在BCDSetting中设置成支持3GB的

#11


引用 10 楼 wu330 的回复:
在BCDSetting中设置成支持3GB的


bcb6,具体是在哪儿设置呀? 

#12


为什么不用文件读写模拟内存读写呢?
参考_lseeki64函数。

#13


总结一下目前取得的进展,

Windows体系操作系统中,程序分为用户态、内核态两种形态,32位程序总共能访问的内存地址有4G,默认情况下其中有2G内存是分给内核模式使用,用户模式能使用的内存最多为2G,而实际情况下一个应用程序最多只能管理到1.6 – 1.7GB的内存。(加上程序本身还有消耗,实际能给用户代码使用的内存更小)
要扩大程序内存使用范围,有以下几种做法:
1、 程序编译为64位。将彻底解决内存访问限制
2、 Window 32位操作系统中,可以通过改变启动参数的方式,将程序默认内核模式占用的内存缩小为1GB,则用户模式能管理的内存能扩大到2.5G左右。具体方式每个版本的windows配置方式均不一样。网上针对每个版本都有详细的配置方法
3、 Window 64位操作系统中,由于32位的程序是运行在它模拟的一套32位子系统环境中,所以通过改变启动参数的方式是不能达到扩大内存范围的效果的。
4、 Visual Studio 2003以上版本,编译程序时可以通过设置LARGEADDRESSAWARE链接选项,达到扩大内存范围的效果。
5、 Bcb6目前还没有找到有效的扩大内存访问范围的方法

#14


引用 4 楼 go_and_see 的回复:
Quote: 引用 2 楼 lingjl2012 的回复:

Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


编译器比较老,是VC6吗?VC6的代码甚至都不用改,可以用VS2005编译成64位的,注意for循环的设置,忘记VS2005在哪里设置了。VC6和VS2005的区别,也就是for循环了,其他问题不大。我们公司不少代码也是VC6改来的,没问题,尝试一下吧。

32位程序最多只能访问那么多内存了,没办法的。

for循环,具体是哪里不同呢?学习学习

#15


引用 14 楼 jianwen0529 的回复:
for循环,具体是哪里不同呢?学习学习


32位程序内存最大访问地址问题

#16


editbin /lardeaddressaware:yes xxxx.exe

#1


重新编译为64位程序。

#2


引用 1 楼 go_and_see 的回复:
重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。

#3


引用 2 楼 lingjl2012 的回复:
Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


只能是重新编译吧。32位程序是运行在64位系统中的32位子环境中的。

#4


引用 2 楼 lingjl2012 的回复:
Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


编译器比较老,是VC6吗?VC6的代码甚至都不用改,可以用VS2005编译成64位的,注意for循环的设置,忘记VS2005在哪里设置了。VC6和VS2005的区别,也就是for循环了,其他问题不大。我们公司不少代码也是VC6改来的,没问题,尝试一下吧。

32位程序最多只能访问那么多内存了,没办法的。

#5


在链接器选项中加上/LARGEADDRESSAWARE,可以增加到接近4GB,另外,64位系统中不需要设置boot.ini。

#6


使用LARGEADDRESSAWARE选项链接的32位应用程序,在32位windows里可以访问3G内存,在64位windows里可以访问4G内存,再多就只能编译成64位了。

#7


引用 4 楼 go_and_see 的回复:
Quote: 引用 2 楼 lingjl2012 的回复:

Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


编译器比较老,是VC6吗?VC6的代码甚至都不用改,可以用VS2005编译成64位的,注意for循环的设置,忘记VS2005在哪里设置了。VC6和VS2005的区别,也就是for循环了,其他问题不大。我们公司不少代码也是VC6改来的,没问题,尝试一下吧。

32位程序最多只能访问那么多内存了,没办法的。


这个程序是在bcb6中编译的, 比较坑爹呢。

#8


引用 6 楼 movsd 的回复:
使用LARGEADDRESSAWARE选项链接的32位应用程序,在32位windows里可以访问3G内存,在64位windows里可以访问4G内存,再多就只能编译成64位了。


大神,知不知道bcb6有没有类似的链接选项呢。。

#9


引用 7 楼 lingjl2012 的回复:
这个程序是在bcb6中编译的, 比较坑爹呢。


BCB不懂,只能帮顶了。

#10


在BCDSetting中设置成支持3GB的

#11


引用 10 楼 wu330 的回复:
在BCDSetting中设置成支持3GB的


bcb6,具体是在哪儿设置呀? 

#12


为什么不用文件读写模拟内存读写呢?
参考_lseeki64函数。

#13


总结一下目前取得的进展,

Windows体系操作系统中,程序分为用户态、内核态两种形态,32位程序总共能访问的内存地址有4G,默认情况下其中有2G内存是分给内核模式使用,用户模式能使用的内存最多为2G,而实际情况下一个应用程序最多只能管理到1.6 – 1.7GB的内存。(加上程序本身还有消耗,实际能给用户代码使用的内存更小)
要扩大程序内存使用范围,有以下几种做法:
1、 程序编译为64位。将彻底解决内存访问限制
2、 Window 32位操作系统中,可以通过改变启动参数的方式,将程序默认内核模式占用的内存缩小为1GB,则用户模式能管理的内存能扩大到2.5G左右。具体方式每个版本的windows配置方式均不一样。网上针对每个版本都有详细的配置方法
3、 Window 64位操作系统中,由于32位的程序是运行在它模拟的一套32位子系统环境中,所以通过改变启动参数的方式是不能达到扩大内存范围的效果的。
4、 Visual Studio 2003以上版本,编译程序时可以通过设置LARGEADDRESSAWARE链接选项,达到扩大内存范围的效果。
5、 Bcb6目前还没有找到有效的扩大内存访问范围的方法

#14


引用 4 楼 go_and_see 的回复:
Quote: 引用 2 楼 lingjl2012 的回复:

Quote: 引用 1 楼 go_and_see 的回复:

重新编译为64位程序。

编译器比较老,不支持64位程序...
还有别的方法么。。。


编译器比较老,是VC6吗?VC6的代码甚至都不用改,可以用VS2005编译成64位的,注意for循环的设置,忘记VS2005在哪里设置了。VC6和VS2005的区别,也就是for循环了,其他问题不大。我们公司不少代码也是VC6改来的,没问题,尝试一下吧。

32位程序最多只能访问那么多内存了,没办法的。

for循环,具体是哪里不同呢?学习学习

#15


引用 14 楼 jianwen0529 的回复:
for循环,具体是哪里不同呢?学习学习


32位程序内存最大访问地址问题

#16


editbin /lardeaddressaware:yes xxxx.exe