32位程序使用超过4G的内存

32位程序使用超过4G的内存众所周知 所有的 32 位应用程序都有 4GB 的进程地址空间 因为 32 位地址最多可以映射 4GB 的内存 对于 MicrosoftWin 操作系统 应用程序可以访问 2GB 的进程地址空间 32 位 Linux 可以访问 3GB 地址空间 这就是称为用户模式的虚拟地址空间 这 2GB 的用户模式虚拟地址空间位于 4GB 地址空间的低一半 而与之相对应的高一半 2GB 地址空间由操作系统内核使用 因此被成为内核模式的虚拟地址空

 

32位程序使用超过4G的内存

    在Windows中,跟AWE相关的API函数有以下几个:

BOOL MapUserPhysicalPagesScatter(
  PVOID* VirtualAddresses,
  ULONG_PTR NumberOfPages,
  PULONG_PTR PageArray
);



   

    给用户分配了上述权限之后,需要在程序中使用代码启用该权限,如下所示:

 

// 设置锁住物理内存的权限,此代码在调用AllocateUserPhysicalPages之前执行
if( !AWESetLockPagesPrivilege( GetCurrentProcess(), TRUE) )
{

    // 输出错误信息
    ……….
}




///        设置或清除启用AWE( Address Windowing Extensions )所需要的锁住内存的权限。
///

/// ///               进程句柄。
///
/// ///               设置或者清除标志。
///
///


///               如果成功,则返回TRUE,否则返回失败。
///



BOOL AWESetLockPagesPrivilege ( HANDLE hProcess, BOOL Enable )
{

       HANDLE                               Token       = NULL;
       BOOL                               Result       = FALSE;
       TOKEN_PRIVILEGES       Info       = { 0 };

    // 打开令牌
    Result = OpenProcessToken ( hProcess, TOKEN_ADJUST_PRIVILEGES, &Token );
    if( !Result )
        return FALSE;


    // 设置权限信息
    Info.PrivilegeCount = 1;
    Info.Privileges[0].Attributes = Enable? SE_PRIVILEGE_ENABLED : 0;

    // 获得锁定内存权限的ID
    Result = LookupPrivilegeValue ( NULL,SE_LOCK_MEMORY_NAME,&(Info.Privileges[0].Luid));
    if( !Result )
    {

        CloseHandle( Token );
        return FALSE;
    }





    // 调整权限
    Result = AdjustTokenPrivileges ( Token, FALSE,(PTOKEN_PRIVILEGES) &Info,0, NULL, NULL);
    if( ( !Result )  || (  GetLastError() != ERROR_SUCCESS ) )
    {

        CloseHandle( Token );
        return FALSE;
    }





    // 成功返回
    CloseHandle( Token );
    return TRUE;
}














版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208323.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:51
下一篇 2026年3月19日 上午11:51


相关推荐

  • DeepSeek完整使用教程:从入门到精通的实战指南

    DeepSeek完整使用教程:从入门到精通的实战指南

    2026年3月16日
    2
  • JavaScript 替换字符串中的反斜杠

    JavaScript 替换字符串中的反斜杠conststr str replace g 替换前 替换后

    2026年3月16日
    2
  • 有监督学习VS无监督学习「建议收藏」

    有监督学习VS无监督学习「建议收藏」事先先说明一下:标签就是指的分好的类别,指明标签就是告诉计算机,这个样本属于哪一类。对于聚类的话,是事先类别都没定义好,但是类别的个数一定要告诉计算机这个问题可以回答得很简单:是否有监督(supervised),就看输入数据是否有标签(label)。输入数据有标签,则为有监督学习,没标签则为无监督学习。首先看什么是学习(learning)?一个成语就可概括:举一反三。此处以高考为例,高考的题目在上

    2022年5月25日
    51
  • requests请求时,遇到的Accept-Encoding问题

    requests请求时,遇到的Accept-Encoding问题在使用requests请求链接的时候,发现请求得到的内容总是一堆乱码:此时请求的headers里的Accept-Encoding是这样写的:headers={‘Accept-Encoding’:’gzip,deflate’,’User-Agent’:str(‘Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:81.0)Gecko/20100101Firefox/81.0’)}查看目标

    2022年7月15日
    33
  • spring aop实例讲解_java swing 教程

    spring aop实例讲解_java swing 教程1.SpringAOP是什么?AspectOrientedProgramming:面向切面编程什么时候会出现面向切面编程的需求?按照软件重构的思想,如果多个类中出现重复的代码,就应该考虑定义一个共同的抽象类,将这些共同的代码提取到抽象类中,比如Teacher,Student都有username,那么就可以把username及相关的get、set方法抽取到SysUser中,这种情况,我们称…

    2022年8月11日
    4
  • 十折交叉验证

    十折交叉验证交叉验证主要分成以下几类 1 k foldercross validation k 个子集 每个子集均做一次测试集 其余的作为训练集 交叉验证重复 k 次 每次选择一个子集作为测试集 并将 k 次的平均交叉验证识别正确率作为结果 优点 所有的样本都被作为了训练集和测试集 每个样本都被验证一次 10 folder 通常被使用 2 K 2foldercross validation 是 k folderc

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号