<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>文章分析(w/AI) &#8211; richliu&#039;s blog</title>
	<atom:link href="https://richliu.com/category/computer/ai/aiarticle/feed/" rel="self" type="application/rss+xml" />
	<link>https://richliu.com</link>
	<description>Linux, 工作, 生活, 家人</description>
	<lastBuildDate>Tue, 19 May 2026 06:07:18 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>ARM 為 Linux 準備 128-bit Page Table Entries：FEAT_D128 解讀</title>
		<link>https://richliu.com/2026/05/19/6537/arm-%e7%82%ba-linux-%e6%ba%96%e5%82%99-128-bit-page-table-entries%ef%bc%9afeat_d128-%e8%a7%a3%e8%ae%80/</link>
					<comments>https://richliu.com/2026/05/19/6537/arm-%e7%82%ba-linux-%e6%ba%96%e5%82%99-128-bit-page-table-entries%ef%bc%9afeat_d128-%e8%a7%a3%e8%ae%80/#respond</comments>
		
		<dc:creator><![CDATA[richliu]]></dc:creator>
		<pubDate>Tue, 19 May 2026 05:57:19 +0000</pubDate>
				<category><![CDATA[ARM]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[文章分析(w/AI)]]></category>
		<category><![CDATA[arm]]></category>
		<category><![CDATA[ARMv9]]></category>
		<category><![CDATA[FEAT_D128]]></category>
		<category><![CDATA[linux kernel]]></category>
		<category><![CDATA[MMU]]></category>
		<category><![CDATA[虛擬記憶體]]></category>
		<guid isPermaLink="false">https://richliu.com/2026/05/19/6537/arm-%e7%82%ba-linux-%e6%ba%96%e5%82%99-128-bit-page-table-entries%ef%bc%9afeat_d128-%e8%a7%a3%e8%ae%80/</guid>

					<description><![CDATA[<p>一、原文摘要 Phoronix 於 2026 年 5 月報導，ARM 正在為 Linux kernel 提交一 [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://richliu.com/2026/05/19/6537/arm-%e7%82%ba-linux-%e6%ba%96%e5%82%99-128-bit-page-table-entries%ef%bc%9afeat_d128-%e8%a7%a3%e8%ae%80/">ARM 為 Linux 準備 128-bit Page Table Entries：FEAT_D128 解讀</a> appeared first on <a rel="nofollow" href="https://richliu.com">richliu&#039;s blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">一、原文摘要</h2>



<p>Phoronix 於 2026 年 5 月報導，ARM 正在為 Linux kernel 提交一組 RFC patch，準備支援 <strong>FEAT_D128</strong>——也就是 <strong>128-bit page table descriptor</strong> 的新翻譯系統 <strong>VMSAv9-128</strong>，這是 ARMv9.3 之後的選用特性。</p>



<p>目前 patch 還在 RFC 階段，KVM、KASAN 等子系統尚未支援。但這代表 Linux 已經為 ARM 下一個世代的虛擬記憶體架構鋪路，預計會在 ARMv9.3 silicon 上市前準備好 enablement。</p>



<span id="more-6537"></span>



<h2 class="wp-block-heading">二、為什麼要做 D128？兩個動機</h2>



<p>ARM 之所以要把 page table descriptor 從 64 bits 加到 128 bits，不是「順便升級」，而是兩個實際撞牆問題：</p>



<h3 class="wp-block-heading">動機 1：實體位址 (PA) 撞到 52-bit 上限</h3>



<p>現有 ARMv8/v9 的 VMSAv8-64 翻譯系統，descriptor 是 64 bits，扣掉屬性位元，能拿來放 PA 的最多 52 bits，也就是 <strong>4 PB</strong>。</p>



<p>聽起來很多，但對於 CXL pooled memory、AI/HPC 大模型訓練、雲端超大記憶體機台這條路線，4 PB 是可預見的天花板。要再往上走，架構上必須換成 128-bit descriptor。</p>



<h3 class="wp-block-heading">動機 2：Descriptor 的屬性 bits 已經塞滿</h3>



<p>64-bit descriptor 裡的 AttrIdx、AP、SH、AF、nG、PXN/UXN、MTE、BTI、GP……幾乎沒有空位。每次要加新功能（更細的權限、虛擬化 metadata、安全/機密運算欄位）都要從別的欄位擠空間。</p>



<p>128 bits 一次把容器翻倍，把累積的「想加但沒地方加」的需求解決，也替未來十年的擴展留路。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>關鍵釐清</strong>：FEAT_D128 是 <strong>descriptor 變成 128 bits</strong>，<strong>不是位址空間變成 128 bits</strong>。新規格實際支援的 PA 是 56 bits（架構可再擴展），不是 2¹²⁸ bytes 那種天文數字。</p>
</blockquote>



<h2 class="wp-block-heading">三、技術代價：page walk 從 4 層變 5 層</h2>



<p>代價不是零：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>64-bit descriptor</th><th>128-bit descriptor (D128)</th></tr></thead><tbody><tr><td>Descriptor 大小</td><td>8 bytes</td><td>16 bytes</td></tr><tr><td>4KB page 內 entry 數</td><td>512 個</td><td>256 個</td></tr><tr><td>每層解析 bits</td><td>9 bits</td><td>8 bits</td></tr><tr><td>Page walk 層數</td><td>4 levels</td><td><strong>5 levels</strong></td></tr><tr><td>一次 cache line (64B) 帶回 entry 數</td><td>8 個</td><td>4 個</td></tr></tbody></table></figure>



<p>為了避免 page table 體積爆炸，ARM 把每層解析的 bits 從 9 砍到 8，所以總層數從 4 變 5。代價就是 TLB miss 時的 page walk 要多走一次記憶體存取。</p>



<h2 class="wp-block-heading">四、效能影響：拿 x86 LA57 類比</h2>



<p>ARM D128 silicon 還沒出，沒有實機數字。但可以參考 x86 從 4-level paging 走到 5-level paging（LA57，Ice Lake-SP 2019 開始）的實測：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>量測項目</th><th>4-level</th><th>5-level</th><th>變化</th></tr></thead><tbody><tr><td>Page walk per level</td><td>20–60 cycles</td><td>20–60 cycles</td><td>—</td></tr><tr><td>Worst-case full walk</td><td>~4×60 = 240 cycles</td><td>~5×60 = 300 cycles</td><td>+25%</td></tr><tr><td>實測 page fault latency 分布 (JabPerf)</td><td>256–511 ns</td><td>512–1023 ns</td><td>~2×</td></tr><tr><td>一般 server workload (SPEC / 雲端)</td><td>baseline</td><td>&lt; 1% 平均退化</td><td>幾乎沒感覺</td></tr><tr><td>Pointer-chasing 重型 workload（圖計算、稀疏 GEMM）</td><td>baseline</td><td>3–5% 退化</td><td>有感</td></tr></tbody></table></figure>



<p><strong>為什麼平均退化這麼小？</strong> 因為 page walker 自己也有 cache：<br />
&#8211; x86 叫 <strong>paging structure cache</strong><br />
&#8211; ARM 叫 <strong>intermediate translation cache</strong></p>



<p>上層的 PGD/PUD entry 幾乎都會 hit，所以實際只多 0–1 次記憶體存取。</p>



<p><strong>ARM D128 的情況可能比 x86 LA57 略糟</strong>，原因有兩個：</p>



<ol class="wp-block-list">
<li>Descriptor 從 8 bytes → 16 bytes，walker 一次 cache line 帶回的 entries 數量減半（8→4），prefetch 效率變差。</li>



<li>每層只解析 8 bits 而不是 9 bits，translation cache 的 locality 稍有不同。</li>
</ol>



<p>但 ARM 通常 TLB / walker cache 設計比 x86 還積極，會抵銷一些。<strong>整體推估：平均退化 &lt; 1%，最壞 case workload 3–5%</strong>。</p>



<h2 class="wp-block-heading">五、ARM 位址擴展演進史</h2>



<p>D128 不是憑空出現，是一條延續路線：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>特性</th><th>架構版本</th><th>PA 上限</th><th>主要改動</th></tr></thead><tbody><tr><td>原始 VMSAv8-64</td><td>Armv8.0</td><td>48 bits (256 TB)</td><td>4-level page walk</td></tr><tr><td>FEAT_LPA</td><td>Armv8.2</td><td>52 bits (4 PB)</td><td>僅限 64KB granule</td></tr><tr><td>FEAT_LPA2</td><td>Armv8.7</td><td>52 bits (4 PB)</td><td>擴展到 4KB / 16KB granule</td></tr><tr><td><strong>FEAT_D128</strong></td><td><strong>Armv9.3</strong></td><td><strong>56 bits (64 PB), 可擴展</strong></td><td><strong>128-bit descriptor, 5-level walk</strong></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">六、為什麼 ARM 不直接學 x86 做 5-level paging 就好？</h2>



<p>這是和 x86 路線最關鍵的差別。</p>



<p>x86 LA57 的做法很單純：descriptor 還是 64 bits 不變，只是再多疊一層 PML5，把 VA/PA 從 48 bits 推到 57 bits。</p>



<p>ARM 不能這樣做，因為<strong>瓶頸不是「層數不夠」</strong>：<br />
&#8211; ARM 用 FEAT_LPA2 已經把 PA 推到 52 bits（在 4-level 架構內就達到了）<br />
&#8211; 真正的瓶頸是 <strong>64-bit descriptor 的 attribute bits 已經用完</strong></p>



<p>所以 ARM 必須換大的容器（descriptor 64→128 bits），不是只加層級。多出來的 64 bits 不只用來放更長的 PA，更重要的是放<strong>新功能的 metadata</strong>：擴展權限、虛擬化欄位、機密運算識別碼等等。</p>



<p>換句話說：<br />
&#8211; x86 LA57 ＝ 把瓶子疊更高<br />
&#8211; ARM D128 ＝ 換更大的瓶子</p>



<p>兩條路線解決的是不同的問題。</p>



<h2 class="wp-block-heading">七、為什麼 KVM 還沒支援？</h2>



<p>RFC patch 明確標註 KVM 暫不支援。原因不是難度高，而是工作量大。</p>



<p>ARM 虛擬化是 two-stage translation：<br />
&#8211; <strong>Stage 1</strong>：Guest VA → Guest PA（Guest 控制）<br />
&#8211; <strong>Stage 2</strong>：Guest PA → Host PA（Hypervisor 控制）</p>



<p>D128 上線後，<strong>Stage 2 的 page table 也要跟著走 D128 格式</strong>，KVM 的 page table 操作、shadow page table、IPA fault handler 全部都要改。這是另一個 patch series 的規模，所以 RFC 先把 Stage 1 (host kernel) 做出來，KVM 之後另案處理。</p>



<h2 class="wp-block-heading">八、結論</h2>



<p>FEAT_D128 不是「ARM 突發奇想做大記憶體」，而是兩個工程現實的回應：<br />
1. 4 PB 的 PA 上限在十年內可見<br />
2. 64-bit descriptor 的 metadata 空間用完了</p>



<p>代僸昢 page walk 多一層，從 x86 LA57 的實測經驗推估，平均效能退化 &lt; 1%，最壞 case 3–5%，業界普遍可接受。</p>



<p>Linux 提早動作的原因，是 ARM 一貫的節奏：kernel patch 要在 silicon 出貨前準備好，等晶片到位時 distro 已能跑。所以現在看到的是「鋪路」，不是「迫切」。</p>



<p>ARMv9.3 silicon 預計 2027 之後上市，到時就會有實機數字驗證這些推估。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">參考資料</h2>



<h3 class="wp-block-heading">原始新聞</h3>



<ul class="wp-block-list">
<li><a href="https://www.phoronix.com/news/Arm-Linux-FEAT-D128-Patches" target="_blank" rel="noopener">Arm Preparing The Linux Kernel For 128-bit Page Table Entries &#8220;FEAT_D128&#8221; — Phoronix</a></li>
</ul>



<h3 class="wp-block-heading">ARM 官方文件</h3>



<ul class="wp-block-list">
<li><a href="https://developer.arm.com/documentation/109697/latest/Feature-descriptions/The-Armv9-3-architecture-extension" target="_blank" rel="noopener">The Armv9.3 architecture extension — Arm Developer</a></li>



<li><a href="https://documentation-service.arm.com/static/67e40a154191d739c8e9ba20" target="_blank" rel="noopener">Feature names in A-profile architecture — Arm Developer</a></li>



<li><a href="https://developer.arm.com/documentation/ddi0601/latest/AArch64-Registers/TTBR0-EL1--Translation-Table-Base-Register-0--EL1-" target="_blank" rel="noopener">TTBR0_EL1, Translation Table Base Register 0 (EL1) — Arm Developer</a></li>
</ul>



<h3 class="wp-block-heading">效能對比與背景延伸閱讀</h3>



<ul class="wp-block-list">
<li><a href="https://www.jabperf.com/5-level-vs-4-level-page-tables-does-it-matter/" target="_blank" rel="noopener">5-level vs 4-level Page Tables: Does It Matter? — JabPerf</a></li>



<li><a href="https://en.wikipedia.org/wiki/Intel_5-level_paging" target="_blank" rel="noopener">Intel 5-level paging — Wikipedia</a></li>



<li><a href="https://lwn.net/Articles/716324/" target="_blank" rel="noopener">5-level paging — LWN.net</a></li>



<li><a href="https://arxiv.org/pdf/2002.01073" target="_blank" rel="noopener">TLB and Pagewalk Performance in Multicore Architectures (arXiv 2002.01073)</a></li>



<li><a href="https://arxiv.org/pdf/2310.04158" target="_blank" rel="noopener">Victima: Drastically Increasing Address Translation Reach (arXiv 2310.04158)</a></li>



<li><a href="https://krinkinmu.github.io/2024/01/14/aarch64-virtual-memory.html" target="_blank" rel="noopener">AArch64 memory and paging — Mike&#8217;s homepage</a></li>



<li><a href="https://wiki.osdev.org/ARM_Paging" target="_blank" rel="noopener">ARM Paging — OSDev Wiki</a></li>
</ul>
<p>The post <a rel="nofollow" href="https://richliu.com/2026/05/19/6537/arm-%e7%82%ba-linux-%e6%ba%96%e5%82%99-128-bit-page-table-entries%ef%bc%9afeat_d128-%e8%a7%a3%e8%ae%80/">ARM 為 Linux 準備 128-bit Page Table Entries：FEAT_D128 解讀</a> appeared first on <a rel="nofollow" href="https://richliu.com">richliu&#039;s blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://richliu.com/2026/05/19/6537/arm-%e7%82%ba-linux-%e6%ba%96%e5%82%99-128-bit-page-table-entries%ef%bc%9afeat_d128-%e8%a7%a3%e8%ae%80/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
