<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>TLB on 大飞的博客</title>
    <link>https://www.dafei.me/tags/tlb/</link>
    <description>Recent content in TLB on 大飞的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 06 May 2026 07:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.dafei.me/tags/tlb/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>从零写OS（七）：虚拟内存，给每个程序一个假的地址空间</title>
      <link>https://www.dafei.me/posts/os-07-vmm/</link>
      <pubDate>Wed, 06 May 2026 07:00:00 +0000</pubDate>
      <guid>https://www.dafei.me/posts/os-07-vmm/</guid>
      <description>&lt;p&gt;上一章内核能分配物理页了，但用的全是物理地址。&lt;/p&gt;
&lt;p&gt;物理地址有个问题：全局唯一，谁都能访问。进程 A 如果知道进程 B 的物理地址，直接就能读写它的数据。这不行。&lt;/p&gt;
&lt;p&gt;解决方案是&lt;strong&gt;虚拟内存&lt;/strong&gt;：每个程序看到的地址都是&amp;quot;假的&amp;quot;，CPU 访问时由硬件自动翻译成真实的物理地址。程序互相隔离，谁也看不见谁。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;地址翻译的硬件机制四级页表&#34;&gt;地址翻译的硬件机制：四级页表&lt;/h2&gt;
&lt;p&gt;x86-64 的地址翻译靠 &lt;strong&gt;MMU&lt;/strong&gt;（Memory Management Unit，内存管理单元，CPU 内部硬件，负责把虚拟地址翻译成物理地址）完成，翻译规则写在页表里，页表的根地址放在 CR3 寄存器里。&lt;/p&gt;
&lt;p&gt;一个 64 位虚拟地址被这样拆开：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;63        48 47    39 38    30 29    21 20    12 11       0
[  符号扩展  | PML4_IDX | PDPT_IDX | PD_IDX | PT_IDX | 页内偏移 ]
               9 bit      9 bit      9 bit    9 bit    12 bit
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;翻译过程是四级查表：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;CR3 → PML4[PML4_IDX] → PDPT[PDPT_IDX] → PD[PD_IDX] → PT[PT_IDX] → 物理页帧
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每级页表是一个 512 项的数组，每项 8 字节，刚好占满一个 4KB 页。每项的低 12 位是 flags，高位是下一级页表（或最终物理页）的地址。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
