eprocess中
為什麼採用二叉樹的方式管理線性位址空間呢?
最主要的原因是使用二叉樹查詢的效能會更好(涉及資料結構)
這個startin**pn和這個endin**pn是以頁為單位也就是(4kb)0x1000
在startin**pn這個位址後新增3個0,也就是這個結點描述的線性位址的起始位址
endin**pn這個位址後新增3個0,也就是這個結點描述的線性位址的結束位址,也就是說這塊線性位址已經被占用了
(如果想知道整個使用者空間低2g的線性位址哪些地方沒有被占用的話,需要遍歷這棵二叉樹,然後去找哪些未在起始位址和結束位址中的線性位址,也就沒有被占用)
如果想知道這塊線性位址到底是被誰占用的呢?可以通過controlarea
看到這個結構體後,再去看看這個結構體中的乙個filepointer值
如果filepointer的值是null,那就說明這塊線性位址對應的是真正的物理頁(這個記憶體是使用virtualalloc 來分配的)
再來看看其它情況
近一步看到filepointer值不為空,再來近一步檢視filepointer指向的地方
它是乙個map記憶體,通過檔案對映的記憶體(這塊記憶體通過檔案對映得到的)
遍歷搜尋鍊錶操作:
!vad 根節點的位址(即vadroot值)
這裡的_mmvad_flags(是+0x014中結構體的成員)
0x000 imagemap //1.映象檔案 0其他
+0x000 userphysicalpages
+0x000 nochange
+0x000 writewatch
+0x000 protection
2.execute 3.execute_read 4.readwiter
6.execute_readwiter 7.execute_writecopy
+0x000 largepages
+0x000 memcommit
+0x000 privatememory
2.map
記憶體分為兩類:
1.virtualalloc分配的普通記憶體
2.map檔案對映記憶體
線性位址 2
linux核心對整個系統的物理記憶體是通過型別為struct page的陣列mem map來管理的。系統中的夥伴系統分配演算法最終是通過操作這個陣列來記錄物理記憶體的分配 等操作。在這裡不要被系統的高階記憶體 低端記憶體等概念搞混淆了,高 低端記憶體的分類主要在於區分物理記憶體位址是否可以直接對映到...
固定對映的線性位址
核心位址空間 核心線性位址空間 3gb,3gb 896mb 線性對映 實體地址空間 0,896m 核心線性位址空間 3gb 896mb,4gb 用來實現 非連續記憶體分配 和 固定對映 固定對映 固定對映的線性位址以 任意方式 與前896mb線性對映方式相比 對映任何實體地址空間 固定對映使用的線性...
線性位址和實體地址
在保護模式下32位 還是採用段機制訪問記憶體 初始化臨時的要進入到ia 32e模式的gdt資料結構 label gdt64 dq 0x0000000000000000 label desc code64 dq 0x0020980000000000 label desc data64 dq 0x000...