上周帮朋友收拾一台老 Z170 平台,插上一张 16GB 显存的计算卡,系统倒是认出了卡,显存却死活只有 256MB,跑任何负载都直接崩。折腾了一整晚,最后定位到 BIOS 里的一个开关:Above 4GB Decoding 压根没开。这应该是我这几年遇到的最典型的"老主板带新卡"翻车现场——不是硬件坏了,也不是驱动不对,而是板子固件默认把 64 位 PCI 地址空间锁死了,大显存设备根本拿不到完整地址窗口。这篇文章不绕弯子,直接把这个选项从原理到实操完整拆一遍,顺便分享老主板没有这个选项时的几种应对方案,以及我踩过的一些坑。
如果你最近也在折腾大显存计算卡、显卡直通、Resizable BAR,或者只是想弄清楚 BIOS 里这个英文选项到底管什么,可以照着我的思路排查一遍。
1. 为什么一张老主板,会让新显卡"只亮一半":Above 4G Decoding 到底在解决什么问题
1.1 从 PCI 地址空间说起:一个被 4GB 红线卡住的世界
电脑里的每个 PCIe 设备,都要向 CPU 申请一段"门牌号",专业点叫基地址寄存器(Base Address Register,BAR)。CPU 访问设备的显存、寄存器,本质上就是访问这一段地址。问题在于,传统 32 位系统最大只能寻址 4GB,而这 4GB 空间既要分给系统内存,又要分给所有 PCIe 设备。
这就好比你开了一家小卖部,一条街一共 4096 个门牌号,内存、显卡、声卡、网卡全挤在这条街上。以前内存只有 512MB、1GB,设备也少,勉强够用。可后来内存加到 8GB、16GB,街还是那条街,新来的设备就住不下了,只能和内存抢地址,或者被挤到一个非常尴尬的位置。
Above 4GB Decoding 这个开关的作用,就是允许固件给 PCIe 设备发放 4GB 以上的"大额门牌号"。设备如果支持 64 位 BAR,就能把自己的地址窗口放到 4GB 以上的高位空间,和系统内存彻底隔开。这是解决"大内存 + 多设备 + 大显存"三者冲突的关键机制。
1.2 显存越大的卡,越需要 64 位地址窗口
很多人以为开启 Above 4G 只是为了识别大内存,实际上它对大显存设备更重要。现代显卡显存动辄 8GB、16GB、24GB,而 CPU 要访问这些显存,必须通过 MMIO(内存映射 I/O)方式映射。显存越大,需要的地址空间就越大。按照 PCIe 规范,设备申请地址空间时往往还要按 2 的幂次向上取整。一块 16GB 显存的卡,BAR 可能直接申请 32GB 的地址空间。
32GB 的空间塞进 4GB 红线以内,物理上就不可能。所以这类设备必须使用 64 位 BAR,并且在开启 Above 4G Decoding 的主板上才能被正确分配。如果这个选项没开,固件只能给显卡一个很可怜的 32 位空间,常见的表现就是显存只识别出 256MB,或者设备直接报资源冲突。
1.3 没有这个开关,受影响的到底有哪些场景
虚拟化直通是重灾区。用 VFIO 做显卡直通时,Guest 系统需要完整看到显卡的 BAR 空间。大显存卡的 BAR 经常超过 4GB,如果宿主机 BIOS 没开 Above 4G,QEMU 在启动时要么报错,要么把 BAR 硬压到 4GB 以下,Guest 里跑起来各种花屏、显存缩水。我在 X99 平台直通 8GB 显卡时,没开这个选项就出现过 Guest 只有 512MB 显存可用的诡异现象。
Resizable BAR 也依赖这个选项。NVIDIA 的 ReBAR 和 AMD 的 SAM 都是把显卡 BAR 从默认的小窗口扩到完整显存大小,让 CPU 一次能访问更多显存。虽然 ReBAR 还需要显卡、驱动、CSM 设置等多重条件配合,但 Above 4G Decoding 是绕不开的前置开关。
多卡场景、PCIe 转接出来的 NVMe 阵列、HBA 卡、FPGA 加速卡,同样对高位 MMIO 空间敏感。只要系统内存超过 4GB 且设备数量多,32 位空间就会很快耗尽,表现就是某张卡时灵时不灵。
1.4 为什么偏偏是"老主板"没有这个开关
这个问题很有时代性。老主板默认没有或者隐藏这个选项,主要原因有三方面。
第一,老固件遵循的还是 PCI/PCI-X 时代的分配逻辑,那时根本没有 64 位 BAR 的大规模需求。第二,为了兼容老设备,厂商故意默认关闭。一些很老的双口网卡、声卡、采集卡,驱动里只做了 32 位地址处理,一旦固件把 BAR 分配到 4GB 以上,这些设备直接不工作。第三,很多入门级主板和 OEM 主板在固件里把选项阉割掉了,不是不支持,而是懒得做界面。
所以你会发现,同样一块 B150 主板,早期 BIOS 里可能根本没有 Above 4G,更新到后期 BIOS 后选项就冒出来了;而有些 OEM 主机,选项则藏在某个不起眼的子菜单里,甚至要借助其他工具才能打开。
2. 菜单藏在哪:几大常见 BIOS 的选项位置和它的等价马甲
2.1 常见品牌的菜单位置
我先说主流品牌的路径,后面说马甲。
| 品牌 | 常见路径 |
|---|---|
| 华硕 | Advanced → PCI Subsystem Settings → Above 4G Decoding |
| 微星 | Settings → Advanced → PCI Subsystem Settings → Above 4G Decoding |
| 技嘉 | Settings → Miscellaneous → Above 4G Decoding(部分老版本在 Peripherals 下) |
| 华擎 | Advanced → PCI Settings → Above 4G Decoding |
| 映泰 | Advanced → PCI Subsystem Settings |
| 七彩虹/铭瑄 | Advanced → PCI Subsystem Settings,少数在 Chipset 下 |
如果你的 BIOS 是中文界面,留意"4G以上解码""4G以上地址映射""高于4GB地址解码"这类翻译。现在不少 BIOS 界面支持关键字搜索(华硕按 F9、微星搜索图标),直接搜 "4G" 比一层层翻菜单快得多。我之前在微星主板上就是靠搜索直接定位的,省了不少事。
2.2 不叫 Above 4G Decoding 的"马甲"名称
不是所有主板都叫这个名,尤其 OEM 和工作站平台。Dell 很多机器的 BIOS 里叫 "PCIe 64-bit BAR" 或者 "MMIO Above 4GB",HP 的机器里有 "PCI MMIO 64-bit",Intel 原厂板在一些版本里叫 "Above 4GB MMIO BIOS assignment"。Insyde 固件(很多笔记本和 NUC 用)里常见 "Memory Mapped I/O above 4GB"。
| 固件/平台 | 常见名称 |
|---|---|
| AMI Aptio V | Above 4G Decoding / Above 4GB MMIO BIOS assignment |
| Insyde H2O | Memory Mapped I/O above 4GB |
| Dell 工作站 | PCIe 64-bit BAR / MMIO Above 4GB |
| HP 工作站 | PCI MMIO 64-bit |
| 部分服务器板 | Enable 64-bit PCI BAR / MMIO High Size |
有一次我在一台 Dell 工作站上找这个选项找了半天,因为它的菜单里叫 "Enable 64-bit PCI BAR Support",完全没提 "4G" 这个词。所以当你在 BIOS 里看到 "64-bit" 和 "BAR" 同时出现,基本就是同一个东西。如果你还是不确定,稳妥的办法是去官网下载该型号 BIOS 用户手册 PDF,用 Ctrl+F 搜 Above 4G,看手册里给出的菜单路径。
2.3 有时候不是没有,而是被隐藏了
有些主板的 BIOS 界面有"普通模式"和"高级模式"之分。华硕按 F7、微星按 F7、技嘉按 F2 进入高级设置,Above 4G 选项往往只出现在高级模式里。有些 BIOS 还会做条件显示:比如必须先关闭 CSM,才会暴露这个选项;或者在某个设置值变成"非默认"后,菜单项才出现。
我处理过一块 H110 主板,BIOS 里翻遍所有菜单都没见 Above 4G,后来发现是 BIOS 版本问题,更新后就出现了。所以在开始折腾第三方工具之前,先做三件事:确认 BIOS 版本、切换高级模式、关闭 CSM 再看一眼。这三步能解决掉一半的"找不到选项"问题。
3. 老主板 BIOS 里根本没有这个选项,怎么破
3.1 先确认不是硬件能力问题,而是固件阉割
动手改之前,先确认平台本身具备这个能力。目前市面上能正常安装 Windows 10/11 的 x86 平台,绝大多数都支持 64 位 MMIO 映射,包括 Intel 6 代酷睿之后、AMD 锐龙全系,以及服务器平台。X79、X99 时代的主板,芯片组本身具备能力,但要看具体 BIOS 是否把选项开放出来。
判断方法很简单:去主板官网看该型号有没有更新版本的 BIOS,更新说明里如果提到 "Above 4G" 或 "Resizable BAR",说明硬件支持。再不行就查芯片组规格页,看 PCIe 控制器是否支持 64 位地址解码。如果平台确实太老,比如一些 4 代酷睿之前的 OEM 方案,那可能真的不支持,改也没用。
3.2 最简单的一步:官网 BIOS 更新
绝大多数老主板用户的问题,根本不需要改 BIOS,只需要更新 BIOS。很多厂商在 2019 年到 2021 年间推出的 BIOS 更新里顺手加了 Above 4G 和 ReBAR 的选项。我以前手头一块 B150M 主板,出厂 BIOS 是 2016 年的,菜单里干干净净;刷到 2019 年的版本后,PCI Subsystem Settings 下面直接多了两项:Above 4G Decoding 和 Re-Size BAR Support。
刷 BIOS 的注意事项不用多说,重点提两个容易忽略的点:一是用官方工具在系统内刷,容易受后台程序干扰,最好用 BIOS 自带的刷新功能或者 DOS/EFI Shell 方式;二是老主板刷新时如果断电真的很致命,能接 UPS 就接,不能接就尽量选供电稳定的时段。
3.3 进阶路线:用 IFR 工具找出被隐藏的开关并修改 NVRAM
如果官方 BIOS 已经没有更新,但你又确认平台硬件支持,那么还有一条进阶路线:修改 NVRAM 里的 Setup 变量,把被界面隐藏的开关打开。这条路线在老玩家圈子里叫 "setup_var 大法",原理并不复杂,但操作需要细心。
先说工具。UEFITool 用来提取 BIOS 固件里的 Setup 模块,IFR Extractor(也叫 Universal IFR Extractor)用来把 Setup 模块里的表单翻译成人类可读的文本,再配合 setup_var.efi 或者 RU.efi 在 EFI Shell 里修改变量值。
具体流程大致如下:
- 从官网下载该主板最新的 BIOS 文件,用 UEFITool 打开。
- 在 UEFITool 里找到名为 Setup 的 PE32 模块,右键导出。
- 用 IFR Extractor 解析导出的文件,生成一个 .txt 或 .ir 文件。
- 在文本里搜 "Above 4G" 或 "4G Decoding",会看到类似 VarStore 和 VarOffset 的信息,记录下变量空间名、偏移量以及 Enable 对应的值。
- 准备一个 FAT32 格式的 U 盘,放入 EFI Shell 启动文件,以及对应的 setup_var 工具。
- 进入 EFI Shell,运行类似
setup_var_3 0x123 0x1的命令,把该偏移量改成 1(具体命令格式取决于工具版本)。 - 重启进 BIOS,查看菜单里是否出现该选项;再重启进系统验证。
这里要提醒一句:setup_var 修改的是 NVRAM 里的设置区域,不是 Console 界面里的临时值。改错了最直接的后果是 BIOS 设置项错乱,系统可能开不了机。所以动手之前,先把 CMOS 清空的手段准备好,能拔电池就拔电池,有 Clear CMOS 跳线更好。另外,不同主板用的 VarStore 空间可能不同,Intel 平台和 AMD 平台在 setup_var 工具的选择上也有差异,别人帖子里的偏移量不能直接照搬。
如果你不想用 EFI Shell,也可以用 RU.efi 这个工具,它自带图形界面,能直接浏览 NVRAM 变量,找到对应偏移量后手动修改。RU.efi 上手稍微麻烦,但胜在能实时看到变量前后变化。
更暴力一点的做法,是用 AMIBCP 这类 BIOS 修改工具直接改 Setup 模块的默认值,然后重新刷入 BIOS。这种做法的风险比 setup_var 高一个量级,一旦刷入过程中断电,主板基本就残了。我个人的建议是:能用 setup_var 解决就别动 BIOS 镜像,能更新官方 BIOS 就别用 setup_var。
3.4 软方案的最后挣扎:部分场景可以绕开
有些朋友不想动 BIOS,想纯粹靠系统层解决。这里我把话说清楚:如果是为了 Resizable BAR 和显卡直通,没有固件支持,软方案基本都靠不住。唯一有点效果的是 Linux 内核参数pci=realloc,它允许内核在启动时重新分配所有 PCIe 设备的资源,有机会把 BAR 挪到高位。
但pci=realloc不是万能的。它要生效,前提是设备本身支持 64 位 BAR,而且内核能顺利接管设备资源。对于直通场景,即使资源重排成功,后续 QEMU 的地址分配也可能因为固件表里的信息不完整而出问题。我实测过在不开 Above 4G 的主板上直接用这个参数,系统能启动,但设备偶尔掉 BAR,稳定性不如开固件选项来得干净。
如果只是想让一张 4GB 显存以内的卡在虚拟化里凑合用,可以试试小 BAR 显卡直通,比如老一点 GTX 750Ti 这类,BAR 都在 1GB 以内,不开 Above 4G 反而能跑。说到底,软方案是妥协,不是根治。
3.5 最坏情况:换板子还是换思路
如果以上方法都走不通,那就是平台在物理层面被限制了。这时候我一般会直接建议换板子,而不是继续折腾。二手平台成本不算高,换一张支持 Above 4G 的板子,能省下后面一大票时间。尤其是玩显卡直通和 AI 推理卡的人,你的时间比主板值钱多了。
如果要继续用老平台,也不是完全没救。可以接受 32 位 BAR 的限制,选择小显存设备,或者调整使用场景。我有块老 X79 板子,至今没法开 Above 4G,但我给它配了张 4GB 显存的亮机卡,当测试机用,一点问题没有。
4. 开启之后,怎么确认它真的生效了
4.1 Linux 下最直接的三个命令
设置完别急着高兴,先验证。Linux 下最直观的方法是看/proc/iomem。正常的输出里应该能看到一大段从100000000开始、标记为PCI Bus的资源区域,比如:
100000000-11fffffff : PCI Bus 0000:00或者类似的高位区域。这说明系统已经把 PCIe 设备的地址空间放到 4GB 以上了。
再用lspci -vvv -s 01:00.0看具体设备。重点看 Region 字段,正常情况下应该显示类似:
Region 0: Memory at f0000000 (64-bit, prefetchable) [size=16G]如果看到地址段大于0x100000000,并且标注了 64-bit prefetchable,基本可以确认 BAR 分配正确。配合dmesg | grep -i bar能看到内核枚举设备时记录的映射关系。
4.2 Windows 下的排查入口
Windows 下最简单的方法是打开设备管理器,在"查看"菜单里切到"资源(按类型)",找到目标设备对应的"内存"条目。如果 Above 4G 生效,你会看到起始地址为0x0000100000000000之类的高位地址。实际上 Windows 经常把高位资源显示成很长的十六进制,只要起始地址的高 16 位不是 0,基本就是高 MMIO 区域了。
HWiNFO64 看 PCI BAR 更直观,它在设备信息里直接列出每块设备每个 BAR 的地址范围和属性。我习惯先在 HWiNFO 里看显卡 BAR 的 Base Address,再和 BIOS 里的设置对应,一眼就能判断分配是否成功。
4.3 直通场景下的黄金验证标准
对于做显卡直通的人,最终验证标准不是 BIOS 里开关亮没亮,而是 Guest 里显存是否完整。我在宿主机直通一张 16GB 显存的卡,开启选项后,Guest 里运行nvidia-smi直接显示 16GB 可用,之前则是 256MB。这才是真正能用的状态。
同时可以注意 QEMU 启动日志里是否有 "BAR allocation failed" 这类提示。如果 BAR 分配失败,日志会非常清楚地告诉你哪块设备、哪个 BAR 没有着落。看到这类错误,先回 BIOS 检查 Above 4G,再检查 CSM 状态,别急着改 QEMU 参数。
5. 实测踩坑:开启后黑屏、设备消失、显存缩水,都是怎么回事
5.1 黑屏的排查链路
开启 Above 4G 后黑屏,遇到的人不在少数,我自己也翻过车。这个问题的根子通常不在 Above 4G 本身,而在 CSM 和显卡 Option ROM。老的独立显卡如果只有传统 BIOS 引导能力,在 CSM 关闭或高位映射状态下,自检阶段就可能黑屏。
排查链路一般是:先把主板上的其他 PCIe 设备都拔掉,只用核显或者一张亮机卡输出,看能不能过自检。能过自检,说明问题出在显卡和 CSM 的组合;过不了,就把 BIOS 用跳线清掉,回到修改前状态。之后再一项一项加回设备,找到那个不兼容的点。
有些主板在开启 Above 4G 后会默认把 CSM 关掉,这时你需要在 Boot 菜单里手动把 CSM 的 Video 选项改成 UEFI,或者干脆关闭 CSM,配合支持 GOP 的显卡使用。老显卡没有 GOP 驱动的话,只能另想办法,比如刷修改版 VBIOS。
5.2 设备消失和启动项丢失
第二个常见坑是开机直接进不了系统,或者某块设备在系统里消失。原因是固件重新枚举了 PCIe 设备资源,原来的设备地址变了,而某些驱动的地址处理写得很死,导致设备"丢了"。这种情况在老旧网卡、电视采集卡上尤其常见。
还有启动项丢失的问题。开启 Above 4G 后,SATA/NVMe 控制器可能被分配到新的资源,UEFI 的启动项里指向旧路径,自然就引导失败。解决办法很笨但有效:进 BIOS 重新指定一次启动项,保存重启就好。如果设备消失是驱动问题,更新到新驱动或换一张支持 64 位 BAR 的卡就好了。
5.3 老扩展卡的兼容性问题
关于老扩展卡,我得单独说一句:不是所有 PCIe 设备都欢迎 Above 4G。有些老设备虽然物理接口是 PCIe,驱动却只处理 32 位地址。开启高位映射后,设备依然能枚举,但分配到的地址超过驱动处理范围,表现为设备属性异常、数据传输错误。这时候你不能怪主板,只能二选一:把这个老设备去掉,或者全局关闭 Above 4G。
我有一块很老的 PCIe 转 SATA 卡,开启后硬盘读写频繁报错。后来确认就是 BAR 地址问题,因为同型号卡在 AHCI 模式下的驱动没有 64 位支持。处理方式是把这块卡退役,换成原生 SATA 口,设备恢复正常。
5.4 和 Resizable BAR 的边界
很多人把 Above 4G Decoding 和 Resizable BAR 混为一谈,以为开了前者就等于开了后者。实际上两者完全不同。
Above 4G Decoding 只是让设备能使用 4GB 以上的地址空间,解决的是"能不能映射到高位"的问题。Resizable BAR 则是允许 CPU 一次性映射显存的大块区域,解决的是"映射多大"的问题。想用 Resizable BAR,除了要开 Above 4G,还需要主板 BIOS 里有 Re-Size BAR Support 选项,显卡本身支持,并且要在纯 UEFI 模式下运行。
老主板即使开了 Above 4G,也不代表它支持 Resizable BAR,因为这是另一个 PCIe 能力位,取决于显卡和固件是否实现。所以碰到开了 Above 4G 但游戏性能没有提升的情况,先别急着骂显卡,去看看自己的 BIOS 有没有 Re-Size BAR Support。
6. 老平台玩大显存设备的最后一道摸底清单
写到最后,我把自己在这类问题上的排查顺序整理成了一份清单,遇到类似情况可以直接照着走。
- 先看主板 BIOS 版本和发布时间。太老的版本先更新,更新后大概率能找到 Above 4G 选项。
- 进 BIOS 高级模式,按前面说的路径找一找选项,注意它的马甲名称,别只搜 "Above 4G"。
- 确认平台硬件本身支持 64 位 MMIO。Intel 6 代酷睿之后、AMD 锐龙全系基本没问题。
- 确认目标设备的 BAR 需求。大显存卡、阵列卡、多卡用户,一定需要这个选项;小 BAR 设备可以暂时不管。
- 如果固件里确实没有,用 IFR 提取 setup 变量,配合 setup_var 在 EFI Shell 里打开隐藏开关。动手前准备好清 CMOS 手段。
- 打开后先不急着装系统,进 BIOS 看启动顺序,重置一次启动项,避免引导失败。
- 进系统后用
/proc/iomem或设备管理器验证 BAR 是否落在 4GB 以上。 - 跑一次真实负载,确认显存识别完整、设备无资源冲突,再交付使用。
6.1 什么时候你可以不折腾这个选项
也不是所有场景都必须开。如果只是亮机、办公、看视频,一张 4GB 显存以内的显卡在小 BAR 模式下完全够用,开不开 Above 4G 没有任何感知。老平台只跑 Windows,不做虚拟化和 AI 推理,也不需要额外折腾。单卡且显存不大,系统内存不超过 4GB 的话,这个问题根本不存在。
我在帮朋友装机时一般会先问一句:你这机器以后会不会插大显存卡、做直通,或者上多卡?如果答案是"不会",那 Above 4G 保持默认关闭就行,反而更省事。如果答案是"可能",那就趁早更新 BIOS 把开关打开,省得以后临阵磨枪。
6.2 我现在的判断标准
经过这一轮折腾,我现在装机第一件事就是进 BIOS 看一眼 Above 4G 和 CSM 状态,比看 CPU 频率、内存时序都优先。遇到一台新到手的主板,我会先花十分钟把 BIOS 从头到尾过一遍,把 PCIe 相关选项、启动模式、安全启动都摸清楚,再开始装系统。这算是踩过坑之后养成的习惯。
如果你也是老平台用户,我最后的建议是:能把选项在 BIOS 里正常打开,就别走修改 NVRAM 的路线;能更新官方 BIOS,就别碰第三方工具。每一步省下来的时间,都会在后面的稳定性测试里加倍还给你。