在这个章节,我们会实现虚拟内存机制。
物理空间和虚拟空间
虚拟空间连续,物理空间不一定连续!
flowchart LR
%% 样式定义(避开关键字,用合法语法)
classDef structStyle fill:#f0f8ff,stroke:#2c3e50,stroke-width:2px,rounded:10px
classDef vaStyle fill:#fdf2f8,stroke:#9b59b6,stroke-width:2px,rounded:10px
classDef vpnStyle fill:#fef7fb,stroke:#9b59b6,stroke-width:1px,rounded:8px,padding:10px
classDef paStyle fill:#e8f4f8,stroke:#3498db,stroke-width:2px,rounded:10px
classDef ppnStyle fill:#f0f8ff,stroke:#3498db,stroke-width:1px,rounded:8px,padding:10px
classDef fieldStyle font-weight:bold,color:#2c3e50
classDef connStyle stroke:#7f8c8d,stroke-width:1.5px,arrowheadStyle:fill:#7f8c8d
%% 上层:结构体(连续字段)
subgraph Struct["📦 TimeVal 结构体(连续虚拟内存视图)"]
direction TB
sec["<span class='fieldStyle'>sec</span><br/>usize (8字节)"]:::fieldStyle
usec["<span class='fieldStyle'>usec</span><br/>usize (8字节)"]:::fieldStyle
end
class Struct structStyle
%% 中层:虚拟地址 VA(连续,跨2个虚拟页)
subgraph VA["🌐 虚拟地址 VA(连续)"]
direction LR
subgraph VPN0["VPN0(虚拟页0)"]
%% 修正:sec 位于 VPN0 末尾,VA = 页起始 + (4KB-8) = 0x40200000 + 0xFF8 = 0x40200FF8
va_sec["0x40200FF8<br/>[页内偏移: 0xFF8 = 4KB-8]"]
end
subgraph VPN1["VPN1(虚拟页1)"]
%% 修正:usec 位于 VPN1 起始,页内偏移 0x000
va_usec["0x40201000<br/>[页内偏移: 0x000]"]
end
note_va["页大小:4KB (0x1000)<br/>VPN0范围:0x40200000~0x40200FFF<br/>VPN1范围:0x40201000~0x40201FFF"]
class note_va vaStyle
end
class VA vaStyle
%% 下层:物理地址 PA(离散)
subgraph PA["💾 物理地址 PA(离散)"]
subgraph PPN0["PPN0(物理页0)"]
%% 物理页0起始 + 偏移0xFF8 = 0x8000 + 0xFF8 = 0x8FF8
pa_sec["0x8FF8<br/>[页内偏移: 0xFF8]"]
end
subgraph PPN1["PPN1(物理页1)"]
%% 物理页1起始 + 偏移0x000 = 0x4000 + 0x000 = 0x4000
pa_usec["0x4000<br/>[页内偏移: 0x000]"]
end
note_pa["物理页独立分配,地址不连续<br/>PPN0范围:0x8000~0x8FFF<br/>PPN1范围:0x4000~0x4FFF"]
class note_pa paStyle
end
class PA paStyle
%% 映射关系(字段 → VA → PA)
sec -.->|字段对应VA| va_sec:::connStyle
usec -.->|字段对应VA| VPN1:::connStyle
va_sec -.->|页表翻译(VPN0→PPN0)| pa_sec:::connStyle
va_usec -.->|页表翻译(VPN1→PPN1)| pa_usec:::connStyle
%% 核心结论标注(突出问题)
conclusion["⚠️ 核心问题:<br/>结构体VA连续(跨页边界),但映射的PA离散<br/>内核需拆为2段写入:<br/>1. PPN0的0x8FF8~0x8FFF(6字节?不,8字节刚好)<br/>2. PPN1的0x4000~0x4007"]:::structStyle
PA -.->|体现| conclusion:::connStyle
管理SV39多级页表