<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Above 4G Decoding on KnightLi的博客</title>
        <link>https://knightli.com/tags/above-4g-decoding/</link>
        <description>Recent content in Above 4G Decoding on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sun, 24 May 2026 00:51:13 +0800</lastBuildDate><atom:link href="https://knightli.com/tags/above-4g-decoding/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Above 4G Decoding 是什么？为什么多 PCIe 设备、NAS 扩展卡和大显存显卡建议开启</title>
        <link>https://knightli.com/2026/05/24/above-4g-decoding-pcie-mmio-bar-explained/</link>
        <pubDate>Sun, 24 May 2026 00:51:13 +0800</pubDate>
        
        <guid>https://knightli.com/2026/05/24/above-4g-decoding-pcie-mmio-bar-explained/</guid>
        <description>&lt;p&gt;&lt;code&gt;Above 4G Decoding&lt;/code&gt; 是主板 BIOS 里的一个底层 PCIe 资源分配选项。它常见于 NAS、小主机、工作站、多显卡主机、软路由、HBA / SATA 扩展卡和本地 AI 机器的调试过程中。&lt;/p&gt;
&lt;p&gt;简单说，它的作用是：允许 64 位系统把 PCIe 设备需要的 MMIO 地址空间，分配到 4GB 以上的物理地址范围。&lt;/p&gt;
&lt;p&gt;这句话听起来很底层，但它解决的问题很现实：当主板上插了显卡、NVMe、网卡、SATA 扩展卡、采集卡、HBA 等多个 PCIe 设备时，如果所有设备都挤在 4GB 以下的老地址空间里抢位置，就可能出现资源分配失败、设备不识别，甚至开机卡死。&lt;/p&gt;
&lt;h2 id=&#34;为什么会有-4gb-这个边界&#34;&gt;为什么会有 4GB 这个边界
&lt;/h2&gt;&lt;p&gt;4GB 边界来自 32 位时代的历史包袱。&lt;/p&gt;
&lt;p&gt;32 位地址空间最大只能寻址：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2^32 bytes = 4GB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;现代电脑早就是 64 位 CPU 和 64 位操作系统，内存也经常是 16GB、32GB、64GB 甚至更多。但主板在开机自检和 PCIe 设备初始化时，仍然需要考虑旧式兼容性。很多 PCIe 设备的资源映射默认会先被安排在 4GB 以下的地址空间内。&lt;/p&gt;
&lt;p&gt;问题在于，4GB 以下的空间并不全是给内存用的。系统还要在里面划出一部分地址给硬件设备使用。&lt;/p&gt;
&lt;p&gt;这就是 &lt;code&gt;MMIO&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;mmio-是什么&#34;&gt;MMIO 是什么
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;MMIO&lt;/code&gt; 是 Memory-Mapped I/O，内存映射输入输出。&lt;/p&gt;
&lt;p&gt;CPU 不能像读写普通内存那样直接“摸到”PCIe 设备内部的寄存器和显存。它需要把设备的一部分寄存器、缓冲区或显存窗口映射到系统地址空间中。CPU 读写这段地址，就等于在和设备通信。&lt;/p&gt;
&lt;p&gt;可以粗略理解为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设备需要一块地址范围。&lt;/li&gt;
&lt;li&gt;主板给它分配一段系统物理地址。&lt;/li&gt;
&lt;li&gt;CPU 访问这段地址时，实际访问的是 PCIe 设备。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这块映射区域不是真的普通 RAM，而是硬件设备占用的地址窗口。&lt;/p&gt;
&lt;p&gt;在旧式默认配置下，很多设备的 MMIO 区域会被限制在 4GB 以下，常见就是 3GB 到 4GB 附近那段空间。设备少时通常没问题，设备一多就开始拥挤。&lt;/p&gt;
&lt;h2 id=&#34;bar-是什么&#34;&gt;BAR 是什么
&lt;/h2&gt;&lt;p&gt;每个 PCIe 设备都会通过 &lt;code&gt;BAR&lt;/code&gt; 向主板声明自己需要多少地址空间。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;BAR&lt;/code&gt; 是 Base Address Register，基地址寄存器。它的作用是告诉主板：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我需要一块 MMIO 空间，请给我分配一个地址范围。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;显卡、NVMe、SATA 控制器、网卡、HBA、USB 扩展卡都可能需要 BAR 空间。设备越多，占用的地址窗口越多。显卡这类设备还可能需要更大的映射空间。&lt;/p&gt;
&lt;p&gt;如果 4GB 以下可用 MMIO 空间不够，主板就可能无法给后插入的设备分配资源。&lt;/p&gt;
&lt;h2 id=&#34;不开启-above-4g-decoding-可能出现什么问题&#34;&gt;不开启 Above 4G Decoding 可能出现什么问题
&lt;/h2&gt;&lt;p&gt;如果关闭 &lt;code&gt;Above 4G Decoding&lt;/code&gt;，主板会更倾向于把 PCIe 设备资源塞进 4GB 以下的地址空间。设备少时看不出来，设备多时就可能出现问题。&lt;/p&gt;
&lt;p&gt;常见场景包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一块独立显卡。&lt;/li&gt;
&lt;li&gt;一个或多个 NVMe SSD。&lt;/li&gt;
&lt;li&gt;一张 JMB585 / ASM1166 SATA 扩展卡。&lt;/li&gt;
&lt;li&gt;一张 2.5G / 10G 网卡。&lt;/li&gt;
&lt;li&gt;一个 Wi-Fi / 蓝牙模块。&lt;/li&gt;
&lt;li&gt;额外的 HBA、采集卡、USB 扩展卡。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些设备都要向主板申请 BAR / MMIO 地址空间。如果 4GB 以下空间被占满，主板可能会出现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某张 PCIe 卡无法识别。&lt;/li&gt;
&lt;li&gt;BIOS 里看不到设备。&lt;/li&gt;
&lt;li&gt;Linux / Windows 里设备缺失或报资源错误。&lt;/li&gt;
&lt;li&gt;开机卡在 POST 阶段。&lt;/li&gt;
&lt;li&gt;黑屏或光标闪烁。&lt;/li&gt;
&lt;li&gt;多设备同时插入时才出问题，单独插每张卡又正常。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 JMB585 SATA 扩展卡场景里，很多人会遇到插卡后主板卡在 BIOS 前，或者加了 NVMe、网卡后扩展卡突然不识别。除了 Option ROM、CSM、PCIe Gen 速率之外，PCIe 地址空间分配也是一个值得排查的方向。&lt;/p&gt;
&lt;h2 id=&#34;开启-above-4g-decoding-后发生了什么&#34;&gt;开启 Above 4G Decoding 后发生了什么
&lt;/h2&gt;&lt;p&gt;开启：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Above 4G Decoding = Enabled
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;等于告诉主板：允许把支持 64 位地址的 PCIe 设备 MMIO 资源，分配到 4GB 以上的地址空间。&lt;/p&gt;
&lt;p&gt;这样，PCIe 设备不必全部挤在 4GB 以下的小空间里。主板可以把部分设备的 BAR / MMIO 映射放到更高地址，减少资源冲突。&lt;/p&gt;
&lt;p&gt;对现代 64 位系统来说，这通常是合理配置。尤其是以下机器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多盘 NAS。&lt;/li&gt;
&lt;li&gt;多网卡软路由。&lt;/li&gt;
&lt;li&gt;插了 SATA / HBA 扩展卡的小主机。&lt;/li&gt;
&lt;li&gt;多显卡工作站。&lt;/li&gt;
&lt;li&gt;AI 推理或训练机器。&lt;/li&gt;
&lt;li&gt;同时有独显、NVMe、采集卡、扩展卡的桌面主机。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的目标不是提升普通软件性能，而是让硬件资源分配更宽松。&lt;/p&gt;
&lt;h2 id=&#34;它和-jmb585--sata-扩展卡有什么关系&#34;&gt;它和 JMB585 / SATA 扩展卡有什么关系
&lt;/h2&gt;&lt;p&gt;JMB585 这类 SATA 扩展卡本身不一定需要很大的 MMIO 空间。但问题往往不是它单独需要多少，而是整台机器上所有 PCIe 设备一起抢地址空间。&lt;/p&gt;
&lt;p&gt;例如一台小主机里可能同时有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个 NVMe 系统盘。&lt;/li&gt;
&lt;li&gt;一个板载网卡。&lt;/li&gt;
&lt;li&gt;一个 Wi-Fi 模块。&lt;/li&gt;
&lt;li&gt;一张 JMB585 五口 SATA 扩展卡。&lt;/li&gt;
&lt;li&gt;可能还有独立显卡或其他控制器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果 BIOS 资源分配比较保守，JMB585 可能成为最后一个被初始化的设备。前面的设备已经占掉不少 4GB 以下资源，到它申请 BAR 时，主板就可能分配失败或进入异常状态。&lt;/p&gt;
&lt;p&gt;这时开启 &lt;code&gt;Above 4G Decoding&lt;/code&gt;，可以让主板把一部分设备资源安排到 4GB 以上，从而降低冲突概率。&lt;/p&gt;
&lt;p&gt;它不能修复坏卡，也不能解决所有 PCIe 链路训练问题，但在“多设备插满后才异常”的场景里非常值得尝试。&lt;/p&gt;
&lt;h2 id=&#34;它和-resizable-bar--sam-的关系&#34;&gt;它和 Resizable BAR / SAM 的关系
&lt;/h2&gt;&lt;p&gt;很多人是因为显卡性能设置才第一次见到 &lt;code&gt;Above 4G Decoding&lt;/code&gt;。例如 NVIDIA / AMD 显卡相关的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Resizable BAR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Re-Size BAR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ReBAR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Smart Access Memory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SAM&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们和 &lt;code&gt;Above 4G Decoding&lt;/code&gt; 有关系，但不是同一个东西。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Above 4G Decoding&lt;/code&gt; 是基础条件。它允许 PCIe 设备的 MMIO 资源被分配到 4GB 以上。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Resizable BAR&lt;/code&gt; 是进一步的能力。传统情况下，CPU 访问显卡显存时，通常只能通过较小窗口分段访问，例如 256MB 级别的映射窗口。启用 ReBAR 后，CPU 可以一次性映射更大范围的显存，理论上能减少访问切换开销。&lt;/p&gt;
&lt;p&gt;很多主板要求先开启 &lt;code&gt;Above 4G Decoding&lt;/code&gt;，再开启 &lt;code&gt;Resizable BAR&lt;/code&gt;。所以可以理解为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Above 4G Decoding&lt;/code&gt;：先允许设备地址放到 4GB 以上。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Resizable BAR&lt;/code&gt; / &lt;code&gt;SAM&lt;/code&gt;：再允许显卡 BAR 窗口变大。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对 NAS 和 SATA 扩展卡来说，重点通常不是 ReBAR，而是前者提供的 PCIe 地址空间。&lt;/p&gt;
&lt;h2 id=&#34;开启它有什么副作用&#34;&gt;开启它有什么副作用
&lt;/h2&gt;&lt;p&gt;对现代 64 位 Windows、Linux、Ubuntu、Debian、TrueNAS、Proxmox 等系统来说，开启 &lt;code&gt;Above 4G Decoding&lt;/code&gt; 通常没有明显负面影响。&lt;/p&gt;
&lt;p&gt;但仍然要注意几个点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;老旧 32 位操作系统可能不适合开启。&lt;/li&gt;
&lt;li&gt;某些很老的 BIOS 或古董 PCIe 设备可能兼容性不好。&lt;/li&gt;
&lt;li&gt;修改 BIOS 后如果无法启动，可以清 CMOS 或恢复默认设置。&lt;/li&gt;
&lt;li&gt;如果启用了 ReBAR / SAM，还要确认显卡、主板、系统和驱动都支持。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在现代硬件和 64 位系统上，它通常是建议开启的底层良性配置，尤其是设备较多时。&lt;/p&gt;
&lt;h2 id=&#34;什么时候建议开启&#34;&gt;什么时候建议开启
&lt;/h2&gt;&lt;p&gt;以下情况建议开启 &lt;code&gt;Above 4G Decoding&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 64 位操作系统。&lt;/li&gt;
&lt;li&gt;主板上插了多张 PCIe 设备。&lt;/li&gt;
&lt;li&gt;有独立显卡，尤其是 4GB 以上显存的显卡。&lt;/li&gt;
&lt;li&gt;使用 JMB585、ASM1166、HBA、阵列卡、采集卡等扩展设备。&lt;/li&gt;
&lt;li&gt;组装多盘 NAS 或软路由。&lt;/li&gt;
&lt;li&gt;使用多显卡、AI 算力卡或本地大模型机器。&lt;/li&gt;
&lt;li&gt;插上某张 PCIe 卡后开机卡死、黑屏、光标闪烁。&lt;/li&gt;
&lt;li&gt;单独插设备正常，多设备一起插就异常。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你正在排查 JMB585 SATA 扩展卡 POST 阶段卡死，推荐把它和这些设置一起检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关闭 &lt;code&gt;CSM&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;禁用不需要的 &lt;code&gt;Storage OpROM&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将 PCIe 速率从 &lt;code&gt;Auto&lt;/code&gt; 或 &lt;code&gt;Gen3&lt;/code&gt; 改成 &lt;code&gt;Gen2&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;开启 &lt;code&gt;Above 4G Decoding&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;更换 PCIe 插槽。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;在-bios-里一般叫什么&#34;&gt;在 BIOS 里一般叫什么
&lt;/h2&gt;&lt;p&gt;不同主板厂商命名略有差异，常见名称包括：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Above 4G Decoding
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Above 4GB MMIO BIOS assignment
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Memory Mapped I/O above 4GB
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;64-bit PCIe decoding
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PCI 64-bit Resource Handling
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;常见位置包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Advanced&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PCIe Settings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PCI Subsystem Settings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Chipset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;North Bridge&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IO Ports&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Boot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有些主板会把它和 &lt;code&gt;Resizable BAR&lt;/code&gt; 放在一起，有些则藏在高级 PCIe 或芯片组选项里。&lt;/p&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Above 4G Decoding&lt;/code&gt; 的核心作用，是让主板可以把 PCIe 设备的 MMIO / BAR 地址空间分配到 4GB 以上。它解决的不是驱动问题，而是 BIOS / PCIe 资源分配层面的地址空间问题。&lt;/p&gt;
&lt;p&gt;对只有少量设备的普通电脑来说，它可能看起来无感。对多盘 NAS、多网卡软路由、插了 JMB585 / ASM1166 SATA 扩展卡的小主机、多显卡工作站、本地 AI 主机来说，它就很重要。&lt;/p&gt;
&lt;p&gt;如果你遇到插上 PCIe 扩展卡后卡 BIOS、黑屏、光标闪烁、设备不识别，或者多设备同时插入才出问题，&lt;code&gt;Above 4G Decoding = Enabled&lt;/code&gt; 是一个值得优先检查的 BIOS 设置。它不是万能药，但它能让现代 64 位硬件摆脱 4GB 以下地址空间的旧限制，减少 PCIe 资源冲突。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
