os_x86

章节03 前置课(选学,介绍x86保护模式下的编程)

1
2
# 顶层cmakelist文件,以下的设置将被子工程所继承使用
cmake_minimum_required(VERSION 3.5) //改成3.5

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)]


os_x86
https://noteforme.github.io/2025/10/30/os-x86/
Author
Jon
Posted on
October 30, 2025
Licensed under