os_x86
章节03 前置课(选学,介绍x86保护模式下的编程)
1 | |
3.0.0 F5运行,提示报错
test工程,选择 调试准备 后 -> 按 F5 ->F5 就可以到shell页面了
课时124 让所有进程都能延时.mp4 对应 0907
一级页表
C1108
page_dir[0] = 0x00000000 | PDE_PS | PDE_P | PDE_W;
page_dir[1] = 0x00C00000 | PDE_PS | PDE_P | PDE_W;
映射关系图:
虚拟地址空间 页目录 物理地址空间
0x00BFFFFF ┐
│ 未映射
0x00800000 ┘
────────────────────────────────────────────────────────────────────
0x007FFFFF ┐ ┌ 0x00FFFFFF
│ │
│ 虚拟4MB~8MB │ 物理12MB~16MB
│ │
0x00400000 ┘ └ 0x00C00000
│ ▲
│ 虚拟地址高10位 = 0000000001 │
▼ │
┌──────────────────────────────┐ │
│ PDE[1] │ │
│ PS = 1 │ │
│ 物理地址高10位 = 0000000011 │─────────────────────────┘
│ 物理基地址 = 0x00C00000 │
└──────────────────────────────┘
────────────────────────────────────────────────────────────────────
0x003FFFFF ┐ ┌ 0x003FFFFF
│ │
│ 虚拟0~4MB │ 物理0~4MB
│ │
0x00000000 ┘ └ 0x00000000
│ ▲
│ 虚拟地址高10位 = 0000000000 │
▼ │
┌──────────────────────────────┐ │
│ PDE[0] │ │
│ PS = 1 │─────────────────────────┘
│ 物理地址高10位 = 0000000000 │
│ 物理基地址 = 0x00000000 │
└──────────────────────────────┘
虚拟地址
┌────────────────┬────────────────────────┐
│ 高10位 │ 低22位 │
│ PDE索引 │ 4MB页内偏移 │
└───────┬────────┴────────────┬───────────┘
│ │
▼ │
查找页目录 │
│ │
▼ │
┌────────────────┬────────────┴───────────┐
│ PDE中的物理高10位│ 保留虚拟地址的低22位 │
└────────────────┴────────────────────────┘
组成物理地址
例如转换虚拟地址 0x00523456:
虚拟地址:0x00523456
高10位:0000000001
↓
选择PDE[1]
低22位:0x00123456
↓
页内偏移
PDE[1]物理基地址:0x00C00000
物理地址:
0x00C00000 + 0x00123456
= 0x00D23456
虚拟地址:[虚拟块编号 1][偏移]
↓ 查PDE[1]
物理地址:[物理块编号 3][相同偏移]
二级页表
page_table[pte_index(vaddr)]
其实两个一样:
page_table + pte_index(vaddr)
等价:
&page_table[pte_index(vaddr)]