每個程序都有自己低2g線性空間需要管理,當申請記憶體的時候需要檢視看線性位址有沒有被占用
eprocess+0x11c vadroot 是乙個二叉樹結構 記錄被占用的線性位址空間
dt _mmvad eprocess+0x11c
nt!_mmvad(x86)
+0x000 startin**pn : 0x8e0
+0x004 endin**pn : 0x8e0
+0x008 parent : (null)
+0x00c leftchild : 0x843b1128 _mmvad //左孩子
+0x010 rightchild : 0x840bf4a0 _mmvad //右孩子
+0x014 u : __unnamed //標誌位
+0x018 controlarea : (null)
+0x01c firstprototypepte : (null)
+0x020 lastcontiguouspte : (null)
+0x024 u2 : __unnamed
(x86)
parent : (null) 代表父節點
leftchild、rightchild 左子樹、右子樹
startin**pn : uint8b 以頁為單位,後面加上000位當前節點線性位址的開始位置
endin**pn : uint8b 以頁為單位,後面加上000位當前節點線性位址的結束位置
**+0x018 controlarea : (null) 代表這塊線性位址被誰占用**
lkd> dt _control_area
nt!_control_area
…+0x024 filepointer : 0x876d0b10 _file_object//如果為空,代表這塊線性位址所對應的是真正的物理頁,自己申請的。反之就是這塊線性位址對映的模組
!vad eprocess+0x11c vadroot(也就是根節點) 從根節點把所有節點展開
+0x014 u : __unnamed //標誌位 mmvad_flags 記憶體屬性
線性位址的管理
eprocess中 為什麼採用二叉樹的方式管理線性位址空間呢?最主要的原因是使用二叉樹查詢的效能會更好 涉及資料結構 這個startin pn和這個endin pn是以頁為單位也就是 4kb 0x1000 在startin pn這個位址後新增3個0,也就是這個結點描述的線性位址的起始位址 endin...
固定對映的線性位址
核心位址空間 核心線性位址空間 3gb,3gb 896mb 線性對映 實體地址空間 0,896m 核心線性位址空間 3gb 896mb,4gb 用來實現 非連續記憶體分配 和 固定對映 固定對映 固定對映的線性位址以 任意方式 與前896mb線性對映方式相比 對映任何實體地址空間 固定對映使用的線性...
作業系統 虛擬記憶體 邏輯位址 線性位址 實體地址
邏輯位址 logical address 是指由程式產生的與段相關的偏移位址部分。例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址,它是相對於你當前程序資料段的位址,不和絕對實體地址相干。只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...