線性位址的管理(滴水中級記憶體篇)

2021-09-26 01:35:28 字數 1102 閱讀 4780

每個程序都有自己低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實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...