60
系系 PTE 系系系系系 995202110 系系系

系統 PTE 區域的管理

  • Upload
    maik

  • View
    120

  • Download
    4

Embed Size (px)

DESCRIPTION

系統 PTE 區域的管理. 995202110 洪 彥伯. 系統 PTE 區域的管理. Windows 中整個位址空間中,除了工作階段空間以外,還有一部分的記憶體也是用 ” 動態記憶體 ” 的方式管理的: 系統 PTE 區域 注意:這部分位址範圍稱為系統 PTE 區域,並非表示他存放的是 PTE ,而是表示這段是用 ”PTE 形式 ” 去管理的。 把 PTE 當做資源管理. 系統 PTE 區域的管理. “PTE 區域 ” 在 PTE 中的位址 “PTE 區域 ” 也是一段記憶體位址,因此在 PTE 中也要占有一些 entry 。 0xc0000000 - PowerPoint PPT Presentation

Citation preview

Page 1: 系統 PTE 區域的管理

系統 PTE區域的管理995202110 洪彥伯

Page 2: 系統 PTE 區域的管理

系統 PTE區域的管理 Windows中整個位址空間中,除了工作階段空間以外,還有一部分的記憶體也是用”動態記憶體”的方式管理的: 系統 PTE區域

注意:這部分位址範圍稱為系統 PTE區域,並非表示他存放的是 PTE,而是表示這段是用”PTE形式”去管理的。 把 PTE當做資源管理

Page 3: 系統 PTE 區域的管理

系統 PTE區域的管理 “PTE區域”在 PTE中的位址

“PTE區域”也是一段記憶體位址,因此在 PTE中也要占有一些 entry。 0xc0000000

與一般 page的差異: 一般頁面有對應的實體記憶體 page PTE區域的頁面在靜止時並沒有對應的實體記憶體

page,當取用時才對應到實體頁面。

Page 4: 系統 PTE 區域的管理

系統 PTE區域的管理 PTE區域未必按照硬體所定義的 PTE格式:硬體 PTE欄位:Typedef struct _MMPTE_LIST{

ULONG Valid : 1;ULONG OneEntry : 1;ULONG filler1 : 8;ULONG prototype : 1;ULONG filler1 : 1;ULONG NextEntry : 20;

} MMPTE_LIST;

Page 5: 系統 PTE 區域的管理

系統 PTE區域的管理 由 NextEntry 可看出, PTE區域是用 list的觀念去管理的。 PTE串列

因為 PTE頁面一定對齊 4K,所以最後 12bit為 0,所以只需 20bit就可表達 PTE區域的一個頁面位址。

Page 6: 系統 PTE 區域的管理

PTE串列的概念 串列、磁簇 (cluster)

磁簇:連續位址的頁面構成一個磁簇。 串列:串列只需要把磁簇的開頭串接起來。

Page 7: 系統 PTE 區域的管理
Page 8: 系統 PTE 區域的管理

PTE區域的管理 PTE區域的用途:

I/O、 kernel stack等動態對應頁面。

管理概觀: PTE區域是一串很長的串列,每次要取用,就要搜尋整個串列,沒有效率。解決方法:做快取

Page 9: 系統 PTE 區域的管理

PTE區域的管理#define MM_SYS_PTE_TABLE_MAX 5

#define MM_PTE_TABLE_LIMIT 16

ULONG MmSysPteIndex[MM_SYS_PTE_TABLE_MAX] =

{1,2,4,8, MM_PTE_TABLE_LIMIT};

UCHAR MmSysPteTables[MM_PTE_TABLE_LIMIT+1] =

{0,0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4};

ULONG MmSysPteMinimumFree[MM_SYS_PTE_TABLE_MAX] =

{100,50,30,20,20};

PVOID MiSystemPteNBHead[MM_SYS_PTE_TABLE_MAX];

ULONG MmSysPteListBySizeCount[MM_SYS_PTE_TABLE_MAX];

ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes];

ULONG MmSystemPtesStart[MaximumPtePoolTypes];

ULONG MmSystemPtesEnd[MaximumPtePoolTypes];

MMPTE MmFirstFreeSystemPte[MaximumPtePoolTypes];

Page 10: 系統 PTE 區域的管理

PTE區域的管理 MmSysPteIndex定義 5種大小的連續”空

PTE區域”頁面區塊。 當要申請 PTE區段時,只要將欲申請的大小當作 index,取出MmSysPteTables中對應的數值即可當作MmSysPteIndex的大小 MmSysPteIndex [MmSysPteIndex

[NumberOfPtes]]

Page 11: 系統 PTE 區域的管理

PTE區域的管理 MiSystemPteNBHead:為每一種大小的連續頁面定義了一個”佇列”。

1 2

4 8

16

Page 12: 系統 PTE 區域的管理

PTE區域的管理 MmSysPteMinimumFree:每種大小的頁面的佇列最小值。 當某個佇列長度< MmSysPteMinimumFree對應值,系統會從 PTE維護的串列中取出區塊加到佇列中。

當用戶釋放區塊時,若對應的佇列上有空間,則加入;若無,則收回到維護的串列中。

佇列上限 (X86): 400,200,60,50,40

Page 13: 系統 PTE 區域的管理

PTE區域的管理”實作” 主要函式有: base\ntos\mm\sysptes.c

MiInitializeSystemPtes MiReserveSystemPtes MiReleaseSystemPtes

Page 14: 系統 PTE 區域的管理

PTE區域的管理”實作” 流程:

MiInitializeSystemPtes初始化 PTE區域初始化 PTE單串列,每個 node是一塊記憶體,稱做

chunk。 MiReserveSystemPtes會申請一塊很大的 PTE區段,然後按小區塊釋放頁面。PMMPTE NTAPI MiReserveSystemPtes (

IN ULONG  NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE 

SystemPtePoolType  )

SystemPtePoolType : SystemPteSpace, NonPagedPoolExpansion

Page 15: 系統 PTE 區域的管理

PTE區域的管理”實作” MiReserveSystemPtes:

根據 NumberOfPtes決定使用哪種佇列 如果佇列區塊數量<預定的最小值

MmSysPteListBySizeCount < MmSysPteMinimumFree

呼叫MiFeedSysPtePool函式,獲得更多區塊。 如果 NumberOfPtes>16,或沒辦法取得指定大小區塊。呼叫MiReserveAlignedSystemPtes

Page 16: 系統 PTE 區域的管理

PTE區域的管理”實作” MiReleaseSystemPtes

要釋放的 PTE必須是”無效”的,也就是對應的虛擬位址沒有對應的實體頁面。

若釋放的頁面<=16,則會插回MiSystemPteNBHead中,而不會歸還到 PTE串列中。

若>16,則須歸還到 PTE串列中。 從MmSystemPtesStart開始搜尋,直到有空間可以插入。

Page 17: 系統 PTE 區域的管理

4.3.1 位址空間的建立和初始化

995202014 陳佑宗

Page 18: 系統 PTE 區域的管理

行程位址空間的建立 呼叫MmCreateProcessAddressSpace函式建立位址空間

這裡僅介紹 Intel x86版本,其程式碼位於 base\ntos\mm\i386\procx86.c檔案的 28-362行

BLEENMmCreateProcessAddressSpace (

IN ULONG MinimumWorkingSetSize , //建立行程的最小工作集的大小IN PROCESS NewProcess , //建立行程的行程物件OUT PULONG_PTR DirectoryTableBase //指向行程位址空間的分頁目錄位址) ;

Page 19: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 1 確保系統有足夠的分頁檔

MiChargeCommitment ( RealCharge , CurrentProcess )

在 intel x86上需確保 4個頁面

Page 20: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 2 確認目前實體頁面是否達到指定的要求

Step 3 形成分頁目錄頁面

MinimumWorkingSetSize

分頁目錄頁面

實體頁面

分頁框架編號PageDirectoryIndex//區域變數

Page 21: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 4 形成超空間分頁表頁面

Step 5 形成 VAD點陣圖

超空間分頁表頁面

實體頁面

分頁框架編號HyperSpaceIndex//區域變數

VAD點陣圖

實體頁面

分頁框架編號VadBitMapPage//區域變數

Page 22: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 6 工作集串列

Step 7 初始化Vm.MinimumWorkingSetSize ,WorkingSetPage ,DirectoryTableBase

工作集串列

實體頁面

Page 23: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 8

填寫好對應 VAD點陣圖和工作集串列的分頁表項目之後釋放此 PTE

一個 PTE

系統 PTE

超空間分頁表頁面對應

VAD點陣圖 工作集串列

Page 24: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 9 在 PFN資料庫中設置分頁目錄頁面的

PTE位址 (虛擬位址 0xc0300000) Step 10 把新行程加入到系統內部維護行程串列 MmProcessList

MmProcessLinks

EPROCESS

……

Page 25: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 11 初始化分頁目錄頁面

之後把 4個頁面的負擔紀錄紀 錄至 MmProcessCommit中

一個 PTE

系統 PTE(動作完後釋放 )

分頁目錄頁面對應

0xc0000000

複製系統空間的 PDE(0x80000000開始的位置範圍 )

超空間分頁表頁面(內涵 VAD 及工作

集 )

PDE

對應

( 全域變數 )

0xc4000000

Page 26: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 12 呼叫MiSessionAddProcess函式把新行程加入到新行程的父行程所在的工作階段空間中

MmInitializeProcessAddressSpace函式被呼叫情況建立新行程時,有記憶體區段物件無位址空間時沒有記憶體物件,類似 fork() 操作時無記憶體區段物件、無位址空間及行程建立相關的旗標亦為關閉時系統初始化階段, parent為 NULL時

新行程 MiSessionSpace ( 全域變數 )

Page 27: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 接下來呼叫

MmInitializeProcessAddressSpace函式初始化使用者空間部分 (0x0-0x7fffffff)NTSTSTUS

MmInitializeProcessAddressSpace (IN PEPROCESS ProcessToInitialize ,//要初始化的目標行程IN PEPROCESS ProcessToClone OPTIONAL ,//新行程的位址空間可從該行程複製獲得IN PVOID SectionToMap OPTIONAL ,// 提供一記憶體區段物件,鰾是在新行程位址空間中對應此物件IN OUT PULONG CreateFlags ,// 各種與行程建立相關的旗標OUT POBJECT_NAME_INFORMATION *AuditName OPTIONAL ,//物件名稱資訊指標) ;

Page 28: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 1 判斷是否更新新行程空間中的系統

PDE(分頁後半部分 ),若需要則呼叫MiUpdateSystemPdes

Step 2 呼叫 KeAttachProcess把目前緒程”暫時”附加至待初始化的行程物件上

Step 3 標明目前正在使用位址空間 2

Step 4 初始化位址建立鎖及工作集互斥器

ProcessToInitialize->Flags = PS_PROCESS_FLAGS_ADDRESS_SPACE2

ProcessToInitialize->AddressCreationLockProcessToInitialize->Vm.WorkingSetMutex

Page 29: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 5 初始化 VAD 樹並設置最後修剪時間及工作集串列

Step 6 初始化新行程分頁目錄和超空間分頁表的 PNF,以及 VAD點陣圖和工作集的 PNF

Step 7 初始化新行程工作集串列

Step 8 若以 3GB 啟動方式或 64位元系統,則需另外建立一 VAD,來保留共用的使用者頁面

Vm.LastTrimTimeVm.VmWorkingSetList

MiInitializeWorkingSetList

Page 30: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 9 Skip Step 10 根據系統登錄設置及目前系統環境來確定是否在新行程中由高向低分配虛擬位址空間

Step 11 建立新行程

ImageFileName

EPROCESS

……

MmMapViewOfSection 參閱 4.3.4

SectionToMap 記憶體區段物件的可執行映像檔(新行程同樣對應 )

PsMapSystemDll

(ntdll.dll對應至新行程位址空間 )

1 2

34

5 MiAllowWorkingSetExpansion

(把新行程的虛擬位址空間插入工作管理串列 )

Page 31: 系統 PTE 區域的管理

行程位址空間的建立 -函式流程 Step 12 行程複製

Step 13 如果是系統行程則什麼也不做 Step 14 如果新行程是一個複製的行程或系統行程則關閉大頁面建立旗標,則結束函式

父行程呼叫MiCloneProcessAddressSpace

MiAllowWorkingSetExpansion

複製位址空間後,把新行程虛擬空間位址插入到工作管理集中串中

檢查目前行程每一個 VAD,且根據頁面屬性檢查 PTE,並複製到新行程,其複製特性見4.4.4

(PROCESS_CREATE_FLAGS_LARGE_PAGES)

Page 32: 系統 PTE 區域的管理

位址空間切換 分頁目錄前半是每個行程私有,老的行程切換

至新的行程後則完全轉移至新行程位址空間 後半為共有,但每個行程分頁目錄頁面是獨立,因此一但切換至新行程後,新位址空間中的PDE項目指向全域的分頁表

新行程有可能指向錯誤的分頁集區,產生分頁錯誤,因此利用”延遲計算”來保持分頁集區分頁表對應的一致性

(MmSystemPagePtes記錄了分頁集區的分頁表對應 )

Page 33: 系統 PTE 區域的管理

位址空間切換 另外 VAD點陣圖及工作集串列的位址所對應的

PDE會指向各自的超空間分頁表頁面 因此在行程切換時,只需要直接切換分頁目錄頁面,無須對分頁目錄的 PDE做任何調整或一致性維護,除了超空間和工作階段空間部分以外,其他皆能在新老行程中保持一致

Page 34: 系統 PTE 區域的管理

4.3.3 行程位址空間的記憶體管理

995202003 張嘉文

Page 35: 系統 PTE 區域的管理

4.3.3

User Mode 可用的記憶體空間 : 0x0 – 7fffffff

要使用一段記憶體位址,必須透過兩步驟 Reserve Commit

Page 36: 系統 PTE 區域的管理

Virtual Memory

Reserve (保留 ) 保留一段記憶體,但不真正使用。 不佔用任何實體記憶體。

Commit ( 提交 ) 真正實際使用記憶體。 實際可提交的量 = 全部實體記憶體 + 分頁檔 – 系統使用記憶體

Page 37: 系統 PTE 區域的管理

VAD (Virtual Address Descriptor) EPROCESS

MMAVL_TABLE* vadRoot

MM_AVL_TABLE

MMADDRESS_NODE balancedRoot

Page 38: 系統 PTE 區域的管理

MM_AVL_TABLE

typedef struct _MM_AVL_TABLE {

MMADDRESS_NODE BalancedRoot;

ULONG_PTR DepthOfTree: 5;

ULONG_PRT Unused: 3;

ULONG_PRT NumberGenericTableElements: 24;

PVOID NodeHint;

PVOID NodeFreeHint;

} MM_AVL_TABLE, *PMM_AVL_TABLE;

Page 39: 系統 PTE 區域的管理

MMVAD

typedef struct _MM_MMADDRESS_NODE {

union {

LONG_PTR Balance : 2;

struct _MMVAD * parent;

}

struct _MMVAD * LeftChild;

struct _MMVAD * RightChild;

ULONG_PTR StartingVpn;

ULONG_PTR EndingVpn;

} MMADDRESS_NODE, *PMMADDRESS_NODE;

Page 40: 系統 PTE 區域的管理

AVL Tree

VadRoot.BalancedRoot.RightChild

Root

[270, 2a3]

[77e40, 77f41]

[130,134]

[300, 305]

[67000, 6700e]

[7ffb0, 7ffd3]

[410,50f]

[7c800, 7c8bf]

[20, 20]

[240,24f]

[77c50,77cee]

[7ffdd, 7ffde]

Page 41: 系統 PTE 區域的管理

Base\ntos\mm\addrsup.c

MiFindNodeOrParent () MiInsertNode() MiRemoveNode()

Page 42: 系統 PTE 區域的管理

VAD點陣圖 MiInsertVadCharges()

StartBit =

(ULONG) (((ULONG)MI_64K_ALIGN (MI_VPN_TO_VA(Vad->StartingVpn)))/X64K);

EndBit =

(ULONG) (((ULONG)MI_64K_ALIGN (MI_VPN_TO_VA(Vad->EndingVpn)))/X64K);

VadBitMap.SizeOfBitMap = MiLastMadBit + 1;

BadBitMap.Buffer = VAD_BITMAP_SPACE;

RtlSetBits (&VadBitMap, StartBit, EndBit – StartBit + 1);

Page 43: 系統 PTE 區域的管理

4.4記憶體分頁995202097 黃彥翔

Page 44: 系統 PTE 區域的管理

分類表項目 --PTE

分頁錯誤!!! Why ? Why ? Why ? 當一個虛擬位置引用時,該位置的分類表項目的有效位為零,則會引發例外。

Windows 核心的 trap handler會將此例外交給記憶體管理員的分頁錯誤處理常式,由它解決無效問題。

BTW,此例外是由硬體觸發的!而分頁錯誤處理常式是OS的元件之一。

Page 45: 系統 PTE 區域的管理

實體記憶體很珍貴 實體記憶體畢竟是有限的資源,隨著越多的行程會用掉越多的實體頁面。

為了避免實體記憶體消耗光, OS 提供了分頁的能力,即把正在使用中的的頁面存放到硬碟,將騰出的空間供給他用。

當磁碟上的頁面再度被引用時,分頁處理常式再將他們喚回記憶體中。

Page 46: 系統 PTE 區域的管理

分頁檔是甚麼? 分頁檔可看作實體記憶體的延伸。

對分頁檔的內容而言,分頁檔等同於實體記憶體,只是會受頁面的調度而在不同位置出現在不同的實體位置上。

Windows系統支援一個或多個分頁檔 (每個磁碟分割最多一個分頁檔 )

Page 47: 系統 PTE 區域的管理

Intel x86中的 PTE

PTE中各個位元的確切定義:分頁框架編號

U R R G L D A Cd Wt U/S W V

Page 48: 系統 PTE 區域的管理

PTE 狀態位元的含意

位元 名稱 說明V 有效 指明此虛擬位置是否對應到一個實體頁面W 寫 在單一處理器上,指明可讀寫或唯讀;在多處理器上,指

明是否可寫U/S 模式 核心模式才可存取 (0)或使用者模式可以存取 (1)

Wt 直接寫 直接寫 (write-throught)記憶體或寫回 (write-back)快取策略

Cd 禁止快取 該頁面禁止存取A 存取過 該頁面已被存取過 ( 讀取或寫入 )

D 髒髒 頁面已被寫過L 大頁面 這是大頁面 PDE,該位元對 PTE無用G 全域 此 PTE 適用所有的行程U 寫 由軟體空置的位元,此位元僅適用於多處理器系統,指明

了可讀寫或唯讀

Page 49: 系統 PTE 區域的管理

前面 4.1.1節提過, TLB包含了最近使用過的虛擬頁面與實體頁面之間的對應關係,以便快速轉譯虛擬位置,以避免多次的記憶體存取。

PTE中的 G位元若被設定,代表該 PTE有效,而不必在 TLB中設為無效;若為 0則 PTE不在有效,因而 TLB中也被設為無效。

Page 50: 系統 PTE 區域的管理

以上顯式的硬體 PTE 完全由 Intel 處理器定義,WRK中也給出對應的 C 語言定義 (base\ntos\mmi\i386\mi386.h)

Page 51: 系統 PTE 區域的管理

4.4.2 軟體 PTE : 無效PTE

和原型 PTE

975402009 黃子權

Page 52: 系統 PTE 區域的管理

無效 PTE

V位元為零時 : 處理器引發分頁錯誤列外 陷阱處理器把控制權交給分頁錯誤處理常式

分頁框架編號(20位元) U R R G L D A Cd Wt U/S W V

Page 53: 系統 PTE 區域的管理

四種無效 PTE 情形 (1)

位於分頁檔 typedef struct _MMPTE_SOFTWARE { ULONG Valid : 1; ULONG PageFileLow : 4; 用于索引在哪个页面文件中,页面文件的结構

MMPAGING_FILE 儲存在一个 MmPagingFile的數组中 一共可以支持 16個页面文件

ULONG Protection : 5; ULONG Prototype : 1; ULONG Transition : 1; ULONG PageFileHigh : 20; 在页面文件中的偏移 } MMPTE_SOFTWARE;

分頁檔轉移 0 0 保護 PFN* 0

31 015 410 912 11

轉移位元

原型位元

Page 54: 系統 PTE 區域的管理

四種無效 PTE 情形 (2)

要求一個零頁面

0 0 0 保護 0 0

31 015 410 912 11

Page 55: 系統 PTE 區域的管理

四種無效 PTE 情形 (3)

頁面轉移 typedef struct

_MMPTE_TRANSITION { ULONG Valid : 1; ULONG Write : 1; ULONG Owner : 1; ULONG WriteThrough : 1; ULONG CacheDisable : 1; ULONG Protection : 5; ULONG Prototype : 1; ULONG Transition : 1; ULONG

PageFrameNumber : 20; } MMPTE_TRANSITION;

分頁框架編號(PFN) 1 0 保護 0

31 01510 912 11

轉移位元

原型位元

WU/SCd Wt

234

Page 56: 系統 PTE 區域的管理

四種無效 PTE 情形 (4)

未知原因

0 0

031 1

Page 57: 系統 PTE 區域的管理

原型 PTE資料結構 記憶體區區段物件中可能包含其頁面的原型

PTE陣列 記憶體管理員利用原型 PTE中的資訊來填充分頁表中實際的 PTE

Page 58: 系統 PTE 區域的管理

六種原型 PTE

有效 位於分頁檔中 位於對應檔中 要求零頁面 轉移 頁面已修改但不寫出

Page 59: 系統 PTE 區域的管理

指向原型 PTE的無效 PTE

指向原型 PTE的無效PTE定義 : typedef struct

_MMPTE_PROTOTYPE { ULONG Valid : 1; ULONG ProtoAddressLow :

7; ULONG ReadOnly : 1; // if

set allow read only access. ULONG WhichPool : 1;

再哪个换页内儲存中 ULONG Prototype : 1; ULONG ProtoAddressHigh :

21; 原型 PTE所在偏移 } MMPTE_PROTOTYPE

原型 PTE 位址7-27位元 1

原型 PTE 0-6位元 0

31 08911 10

原型位元

17

Page 60: 系統 PTE 區域的管理

共用記憶體區中原型 PTE用法

行程A分頁表

P1的PTE

P2的PTE

行程B分頁表

P1的PTE

P2的PTE

分頁檔

頁面P2