/3GB开关对内核空间的影响

2023/11/30 9:18:28

书接上回

/3GB开关的一个不利影响在于,它将内核空间压缩至1GB,从而迫使内核代码必须能在一个较小的地址空间中运行。

对于这个空间限制,最受影响的是显卡驱动程序。为了管理显卡上的内存,显卡驱动需要能访问到这些地址空间,从而需要更多的虚拟空间进行映射操作。当一个显卡驱动需要访问一个256MB的地址空间的时候,这个操作通常不会成功,因为内核中确实没有这么多的可用空间留给显卡驱动程序了。
正所谓:巧妇难为无米之炊。

所有的内核数据结构都必须能合理地存放在这总共1GB的地址空间中,包括页表(Page Table),页目录(Page Directory),位图,显卡驱动占用。地址空间资源实在是太过紧张了,但如果你愿意减少一些不必要的空间使用(例如不需要这么大的显卡空间映射),系统几乎可以继续稳定运行。

这就有点像是在一个狭小的试衣间里换衣服。你可以想方设法实现,但这是一场真正的斗争,你将不得不做出某种牺牲,而且结果并不总是很美好。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Kernel address space consequences of the /3GB switch》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。


http://www.jnnr.cn/a/5685.html

相关文章

解惑之所谓的最大2GB可用虚拟地址空间

咱们先来一个陈述:虚拟内存和虚拟地址空间不是一回事儿。 可能有些人容易将这两个概念弄混,今天来说说。 虚拟地址空间描述了地址是如何被解析,每一个进程都有它自己独立的虚拟地址空间。一个进程使用了多少虚存空间不会对影响其他进程。 假…

只有当物理内存超过2GB时才需要/3GB

首先请记住:物理内存和虚拟地址空间不是一回事儿。 我认为,这又是另一个容易令人搞混的两个概念。解物理内存和虚拟内存之间并非简单的一对一的关系。在一般情况下,你所拥有的虚拟内存会远远多于机器上配备的物理内存。空闲物理不会映射到任…

为什么最近的文章都是关于PAE和/3GB的

大家可能都注意到了,我最近的几篇文章都是在讲PAE和/3GB相关的主题,可能有一些人已经有点厌烦了,可能这些人还不少。 为什么我要花费差不多两个星期来讲述/3GB开关有关的内容以及一些基础概念,如虚拟内存,虚拟地址空间…

/3GB是一个全局开关

/3GB开关只会对那些标记为/LARGEADDRESSAWARE的应用程序产生影响。 为了保持兼容性,只有那些明确表明它们能处理超过2GB的虚拟地址空间的程序,才会获得更大的虚拟地址空间。而那些没有这个标记的,只会得到2GB的虚拟地址空间,而位…

Visual Studio静态分析组件更新一览

咱们C静态分析团队的一个主要目标就是:让广大的C老哥们编写尽可能安全的代码。 一直以来,我们一直在持续地向静态分析组件中添加新的安全代码检查并处理开发者报告的各种Bug。感谢你们。 下面我汇总了所有从Visual Studio 2019 v16.10 到 v16.11之间所有…

/3GB开关并不能映射一个3GB大小的内存

如果你使用了/3GB,则你得到一个3GB的虚拟地址空间,但这并不意味着你可以映射一个3GB大小的内存块。在这个地址空间中会有一些标准的”空洞”,例如:位于地址空间底部的64KB,以及位于2GB边界的64KB。 而且,系…

为什么32位系统上虚拟地址空间是4GB

在一台32位系统上,虚拟地址空间为4GB,这个大小由系统上指针的可用数量决定。 对于一块32位的处理器,一个32位值可以表达232个不同的数值,如果你将每一个数值都指向不同的内存地址,则你就得到了一个232个字节的地址空间…

PAE真的能提升虚拟地址空间吗

实际上,这是另一个不符合逻辑的推断。 PAE(Physical Address Extensions,物理内存扩展)主要是用来提升处理器能够寻址的物理内存,和虚拟内存没有关系。在一台搭配了奔腾2处理器的32位系统上,使用PAE,可以使处理器能够…

误解:如果你想使用AWE,则必须先启用PAE

我们先来看看AWE的一个官方解释,看看它到底是什么样一个玩意儿: 地址窗口扩展 (AWE) 是一组扩展,允许应用程序快速操作大于4GB的物理内存。某些数据密集型应用程序,例如数据库管理系统和科学与工程软件,需要访问非常大…

说说有点意思的STRRET结构体

如果你曾经折腾过外壳命名空间(shell namespace),则我想你一定碰到过古怪的STRRET结构体。 这个结构体是 IShellFolder::GetDisplayNameOf用来返回一些列外壳项目名称的。 如果你阅读文档就可以知道,一个STRRET结构有时候是一个ANSI字符串的缓冲区&…

叨一叨注册表中的字符串类型值

如果一个注册表表项的值类型为REG_SZ,请注意了,它并不意味着这个字符串一定会以一个空字符串结束。从底层实现的角度来说,注册表仅仅是一个层次化组织的名值数据库而已。 所以,你可以使用一些小技巧来”欺骗”注册表。 很多人都会…

为什么不能将FILETIME看做__int64

我们先来看看FILETIME这个结构体,它通过组合两个DWORD来表示了一个64位的整数值。 你可能想将这个FILETIME结构体看做一个整体,然后将它们看做一个__int64结构来进行访问。 毕竟,这两个类型的内存布局都是一样的,下面是一些开发者…

为什么有些结构体中会定义一个字节的数组

有一些Windows结构体是可变长度的,它们通常会有一个固定长度的头部,然后接下来是一个可变长度的数组。当这些结构体被声明的时候,它们通常会被声明为一个只有一个字节元素的数组,如下图所示: 如果我们观察一下头文件中…

关于x86平台上内存对齐的重要性

有时候,未对齐的内存访问,可能会导致系统挂起。 有一些显卡不允许驱动程序一次性就访问所有的显卡内存。取而代之的做法是:它给你一个访问窗口,你可以从中选择一个显存的子集来进行访问。举个例子,EGA显卡有256K的字节…

如何寻找IE浏览器的执行路径

基于某些原因,有些开发者希望能获取到IE浏览器(Internet Explorer)的全路径,这样就可以在二进制执行文件上加上一些选项了。 其实,并不需要这样。 只需要向ShellExecute函数传递”IEXPLORE.EXE”这个参数,它就会有方法找到IE的执行…

为什么BIOS里的时间是本地时间

尽管Windows NT内部使用的是UTC时间,但是BIOS里的时间还是本地时间,这是为啥? 原因有那么一些,其中一个原因就是为了保持向后兼容性。 在早期,人们经常在Windows NT和MS-DOS/Windows 3.1之间进行双启动。MS-DOS和Wind…

即使在计算机的世界,同时性也只是相对的

爱因斯坦告诉我们:同时性是相对的。也即:在不同的地点发生的两个事件,在一个惯性系里是同时的,但在另一个惯性系里看来却不是同时的。而在计算机的世界里,同时性也是相对的。容我慢慢道来。 有些开发者会问&#xff1…

注意:Shift按键会覆盖NumLock

也许这个事实有很多人还不知道,但是在那个箭头和数字共用同一个按键的那个年代,确实会发生如标题所描述的事情:Shift按键会覆盖NumLock按键。 如果NumLock按键打开(通常它就是处于打开的状态),然后按下一个数字按键的同时&#x…

如何将一个字节数组转换为System.String

因为某些原因,这个问题被问得特别频繁:我如何将一个字节数组(byte [])转换为一个System.String? (是的,你没看错,我说的是和CLR相关的东西。如果你觉得有些意外了,抱歉了啊) 简而言之,请使用下面这个技法…

为什么在安腾平台上的页面大小是8KB

在x86架构的机器上,Windows选择将4KB作为页面的大小,因为当时设计操作系统时,处理器架构只能支持4KB的页面。(后来,CPU添加了对4MB的页面的支持,我记得好像是奔腾处理器吧,但是对于大多数人来说&#xff0c…
最新文章