145
Operating System Kernels 第第第第第 1

Modern Operating System Kernels

  • Upload
    lucia

  • View
    70

  • Download
    356

Embed Size (px)

DESCRIPTION

Modern Operating System Kernels. 第五 組 報告. 1. 目錄. 4.1 記憶體管理概述 4.1.1 分頁式記憶體管理 4.1.2 Segmentation 4.1.3 記憶體管理演算法介紹 4.1.4 Windows 記憶體管理概述 4.2 Windows 系統記憶體管理 4.2.1 系統位址空間初始化 4.2.2 系統位址空間記憶體管理 系統非分頁集區的管理演算法 系統分頁集區的管理演算法. 2. 4.1 記憶體管理概述. 資工 4 A 郭 濬愷. 3. 實體位址 (physical address). - PowerPoint PPT Presentation

Citation preview

Page 1: Modern Operating System  Kernels

Modern Operating

System Kernels

第五組報告1

Page 2: Modern Operating System  Kernels

目錄• 4.1 記憶體管理概述

4.1.1 分頁式記憶體管理 4.1.2 Segmentation 4.1.3 記憶體管理演算法介紹 4.1.4 Windows 記憶體管理概述

• 4.2 Windows 系統記憶體管理 4.2.1 系統位址空間初始化 4.2.2 系統位址空間記憶體管理

① 系統非分頁集區的管理演算法② 系統分頁集區的管理演算法

2

Page 3: Modern Operating System  Kernels

資工 4A郭濬愷

4.1 記憶體管理概述

3

Page 4: Modern Operating System  Kernels

實體位址 (physical address)

• 系統的記憶體的真正位址• 一個 32 位元或 36 位元的不帶正負號的整數

4

Page 5: Modern Operating System  Kernels

虛擬位址 (virtual address)

虛擬記憶體讓各程序共享系統記憶體空間, 這樣系統就似乎有了更多的記憶體。

• 優點擴大位址空間記憶體保護 記憶體映射 公平分配記憶體虛擬記憶體共享

5

Page 6: Modern Operating System  Kernels

6

Page 7: Modern Operating System  Kernels

邏輯位址 (logical address)

• 包含兩個個部分:區段 (segment) 和偏移 (offset)• 邏輯位址的實際位址是區段基址加上偏移量

7

Page 8: Modern Operating System  Kernels

8

Page 9: Modern Operating System  Kernels

分頁式記憶體管理

資工四 A 黃柏皓

965002019

9

Page 10: Modern Operating System  Kernels

Intel x86 Address Translation

Logic Address

Segmentation

Virtual Address

Physical Address

Paging

10

Page 11: Modern Operating System  Kernels

Introduction

• 虛擬位置 實體位置

• page page frame

• 連續 不一定

11

Page 12: Modern Operating System  Kernels

Virtual Address Form

• 32bits

• Intel x86

Index Offset

分頁表目錄Index

分頁表Index

Offset31 22 21 12 11 0

12

Page 13: Modern Operating System  Kernels

Address Translation(Intel x86)

分頁表目錄Index(PD

E)

分頁表Index(PT

E)Offset

……

CR3

●●●●

……

……

二級分頁表結構

優點 :節省 page table

缺點 :效能降低

10 10 12

x1024

x1024 x1024

13

Page 14: Modern Operating System  Kernels

TLB (Translation look-aside buffer)

• 快取位址轉譯資訊o 成功 : 直接取出儲存的位址資訊 (TLB)o 失敗 : 兩次存取記憶體 (TLB, Page table)

• 記憶體存取有區域性

• 硬體處理o 切換 CR3 暫存器o invlpg 指令 (Intel x86 Pentium Pro)

14

Page 15: Modern Operating System  Kernels

15

Page 16: Modern Operating System  Kernels

Address Translation• Virtual→physical • Page fault 問題

• 多對一– 4G VM / 1G PM

• 共用問題– 寫入

CPU

TLB

Page Table

Program Space

Disk

Memory

VA

Data

TLB miss

Page fault

16

Page 17: Modern Operating System  Kernels

Address Translation

• Page faulto Random o LRU

• 寫入記憶體o Write-througho Write-back

17

Page 18: Modern Operating System  Kernels

PAE(Physical Address Extension)

• 三級分頁表

• 分頁表目錄、分頁表 每一個 Entry 大小 : 64 bits

o 每個 page( 分頁目錄、分頁表 ) 只能存放 512 項o 實體位置描述 : 20bits→24bits( 包含 12 個 flag

bits)o 可支援 :2^(24+12) bits = 2^36 bits = 64

GB (windows : 使用 26bits 表示→ 256GB)

18

Page 19: Modern Operating System  Kernels

PAE-Address Translate

分頁表目錄指標 Index

分頁表目錄Index(PD

E)

Offset

31 30 29 21 12 0

分頁表Index(P

TE)20 11

44*512

4*512*512

64bits24bits PA

x512

x512 x512

19

Page 20: Modern Operating System  Kernels

PAE Example(pae.asm)

push ebx push esi

mov ebx, [esp] + 16 ; ebx = NewPteContents lowpart mov ecx, [esp] + 20 ; ecx = NewPteContents highpart

mov esi, [esp] + 12 ; esi = PtePointer

mov edx, [esi] + 4 mov eax, [esi] ; edx:eax = OldPteContents lock cmpxchg8b qword ptr [esi] ; compare and exchange

jnz short swapagain ; if z clear, exchange failed

pop esi pop ebx

New esi

New PTE

New PTE

ebx

esiesi

ebx

New esi

New PTE

New PTE

ecx ebx

edx eax

esi+4 esi

ecx ebx

edx eax

20

Page 21: Modern Operating System  Kernels

PAE Summary

• 沒有增加 virtual memory 大小

• 增加可支援的 physical memory

• Windows(64bits in Intel x64): o 48bits Virtual Mem → 40bits Physical

Mem(1TB)

21

Page 22: Modern Operating System  Kernels

Segmentation

資工四 A 許木炘

22

Page 23: Modern Operating System  Kernels

Logic address 邏輯位址

Segment( 節區 )• a16-bit segment selector

(segment identifier)

Offset( 偏移量 )• a 32-bit offset within the segment

identified by the segment selector

23

Page 24: Modern Operating System  Kernels

Segment selector

24

Page 25: Modern Operating System  Kernels

segmentation register• 為了讓 segment selector 能被快速取出 -> segmentation register

cs: 指向 code segment # (cpl 0 or 3)ss: 指向 stack segmentds: 指向 data segment.es, fs, and gs: 一般用途,可以參用到任何 data

segment

25

Page 26: Modern Operating System  Kernels

Segment Descriptors

• 每個 segment 可用一個 8byte 的 descriptor 表示,每個 segment descriptor 會儲存在

->GDT(global descriptor table)或

->LDT(local descriptor table)

26

Page 27: Modern Operating System  Kernels

Segment Descriptors • Base field (32): the linear address of the first byte

of the segment.• G granularity flag (1): 0 (byte); 1 (4K bytes).• Limit field (20).• S system flag (1): 0 (system segment); 1 (normal

segment).• Type field (4): segment type and its access rights.• DPL (Descriptor privilege level) (2):• Segment-present flag• D/B flag• Reserved bit• AVL flag

27

Page 28: Modern Operating System  Kernels

常用的 segment descriptor

• Code Segment Descriptor.• Data Segment Descriptor.

o P.S.: Stack Segments are implemented by means of Data Segment Descriptors.

• Task State Segment Descriptor (TSSD)o A TSSD describes a Task State Segment

(TSS) which is used to store the contents of a process registers.

• Local Descriptor Table Descriptor (LDTD)

28

Page 29: Modern Operating System  Kernels

29

Page 30: Modern Operating System  Kernels

Segment Registers

• Each segment register contains a segment selector. 13-bit index 1-bit TI (Table Indicator) flag. 2-bit RPL (Requestor Privilege Level)

• The cs register’s RPL also denotes the current privilege level of the CPU.

• 0 represents the highest privilege. 0 represents the kernel mode and 3 represents the user mode.

• Associated with each segment register is an additional nonprogrammable register which contain the segment descriptor specified by the segment selector

30

Page 31: Modern Operating System  Kernels

快速存取 segment descriptor

31

Page 32: Modern Operating System  Kernels

Locate the Segment Descriptor Indicated by

Segment Selector

• address=(gdtr/ldtr) + index*8.

• GDT 的第一個欄位永遠試設為 0.

• 能儲存在 GDT 的節區描述器最大的數目為 8191 2^13 - 1

32

Page 33: Modern Operating System  Kernels

Segmentation unit

33

Page 34: Modern Operating System  Kernels

記憶體管理演算法介紹

34

Page 35: Modern Operating System  Kernels

• 就本質而言,記憶體管理演算法可以分為兩大類o點陣圖標記法 (Bitmap)o空間串列法 (AV List)

35

Page 36: Modern Operating System  Kernels

點陣圖標記法 (Bitmap)

• 假設要分配的記憶體大小為 N bytes ,而一個blocks 為 M bytes ,並且符合下列等式 N=K*M 也就是說現在共用 K 個 blocks 要做動態管理!

• 點陣圖標記法:使用 K 個 Bits 的 Bitmap 來記錄這個 K 個 blocks 的使用情形o 0:freeo 1:Allocated

36

Page 37: Modern Operating System  Kernels

• 分配:根據請求的大小確定需要多少個連續memory blocks ,然後掃 Bitmap 是否存在這樣的連續空間,若有將 Bitmap 中對應的連續bits 設為 1

• 釋放:指定要釋放的記憶體起始位址和大小,將bitmap 對應的連續 bits 設為 0

37

點陣圖標記法 (Bitmap)

Page 38: Modern Operating System  Kernels

• 此法實作較簡單,但須額外的記憶體負擔,通常為

其中

• 若請求的記憶體大小不為 M 的倍數則會有空間浪費,平均而言會有 M/2 bytes 浪費!

• 每次分配需要掃瞄 bitmap ,因為時間複雜度為 O(K)

38

點陣圖標記法 (Bitmap)

Page 39: Modern Operating System  Kernels

• 首先建立一個空閒串列 (Available list)

• 在初始時,整個區塊被當作一個大的空閒區塊加入到空閒串列 (Available list) ,每當記憶體管理員收到分配請求便從 AV list 中尋找適合空閒區塊

39

空間串列法 (AV List)

Page 40: Modern Operating System  Kernels

• 尋找適合的空閒區塊的方法共有以下幾種first-fit: 將 list 中第一個找到的空閒區塊分配

出去best-fit: 從 list 中找到最接近要求的記憶體大

小之區塊,並將其分配worst-fit: 從 list 中找最大空閒區塊將其分配next-fit: 從 list 目前的位置往後掃瞄,找到第

一個符合請求的空閒區塊

40

空間串列法 (AV List)

Page 41: Modern Operating System  Kernels

AV List Example

41

Page 42: Modern Operating System  Kernels

42

First Fit

缺 :• 在串列的前端會產生許多極小的可用空間 ( 被配置機率

很低 )可用 Next-Fit 來解決

P1

P2

P3

P4

200K

25K

200K

Page 43: Modern Operating System  Kernels

Best Fit

缺 :1. 需搜尋完全部串列,才可找到最佳的配置區塊2. 產生更大量的 fragmentation

P1

P2

P3

P4

25K

50K

100K

250K

43

Page 44: Modern Operating System  Kernels

Worst Fit

P1

P2

P3

P4

100K

100K

200K

25K

44

Page 45: Modern Operating System  Kernels

伙伴系統 (Buddy System)

• 以 2 的冪次作為 memory 的配置單位,假設總memory size 為 則宣告 AV[K] 的 list 陣列,陣列元素 AV[i] 記錄了大小為的空間串列開頭

• 配置 : 假設要配置的空間大小為 n 則求出 >n 中i 的最小值,並去 av list 中尋找 k[K] 不為空串列,若 k=i 則自 AV[K] 中取出一區塊並配置,若 K>i則自 AV[k] 中取出一個 block 將分為兩塊(大小皆為)將其中一塊加入 AV[K-1] 的串列中,另一塊持續切割至大小為時再將其分配

45

Page 46: Modern Operating System  Kernels

• 假設有一個記憶體配置要求為 3 Blocks ,則需要之 block ,則此時檢查 AV[2] ,若不為 NULL 則配置,否則往下尋找AV[3] ,直到不為 NULL ,切割直到大小相符!

46

Page 47: Modern Operating System  Kernels

• 分配和回收的時間複雜度皆為 O(log n)• 但依然存在外部分散

47

伙伴系統 (Buddy System)

Page 48: Modern Operating System  Kernels

分散 (fragmentation)

• 分散 (fragmentation) 共分為兩種o 外部分散 (external fragmentation)

在連續配置的方法下每個 free block皆不夠但全部的 free block 加總後可以滿足要求的空間,然後因為不連續所以不能滿足此要求,便稱為外部分散 ( 以上介紹的演算法皆存在此種問題 )

o 內部分散 (internal fragmentation) 配置出去的空間超過要求的 size ,兩者之間的差值無 法被有效利用,形成浪費稱為內部分散

48

Page 49: Modern Operating System  Kernels

分頁式記憶體管理系統(Page memory Management)

• 為了解決記憶體的外部分散,我們使用了分頁式的記憶體方法,而當實體的記憶吃緊時,我們變要選擇哪些的 process該swap out 到 disk 中哪些該寫入實體記憶中,而且這個管理方法就稱為 頁面替換演算法 (Page Replacement Algorithm)

49

Page 50: Modern Operating System  Kernels

頁面替換演算法(Page Replacement Algorithm)

• 最佳頁面替換演算法(The Optimal Page Replacement Algoritm)

• NRU(The Not Recently Used Page Replacement Algortim)

• FIFO(The First-In First-Out Page Replacement Algorithm)

• 第二次機會替換演算法(The Second Chance Page Replacement Algorithm)

50

Page 51: Modern Operating System  Kernels

頁面替換演算法(Page Replacement Algorithm)

• LRU(The least Recently Used Page Replacement Algorithm)

• NFU(The Not Frequently Used Page Replacement)

51

Page 52: Modern Operating System  Kernels

最佳頁面替換演算法(The Optimal Page Replacement Algoritm)

• 一個理論上的最佳演算法,在這個演算法理,我們被要求能夠預測每個頁面下次的使用時間,進而確定最佳替換順序,因為預測的不可行,所以此為理論不可能實作,但常用來與其他演算法比較!

52

Page 53: Modern Operating System  Kernels

The Optimal Page Replacement Algorithm Example

53

back

Page 54: Modern Operating System  Kernels

最近未使用頁面替換演算法

(The Not Recently Used Page Replacement Algortim)

• 存取位元R

• 修改位元M

• 此 2 位元(R, M)有下列 4 種組合,依據順序進行替換o (0, 0):表示最近沒有被行程使用,也沒有被行程修改,是最佳的替換分頁o (0, 1):表示最近沒有被行程使用,但是已經被修改過,此分頁須先寫回磁碟後,才可進行替換

o (1, 0):表示最近曾被行程使用,但是沒被修改過,由於可能再次被使用,故盡量不要替換此分頁

o (1, 1):表示最近曾被行程使用,也被修改過,所以需寫回磁碟中,是最差的替換分頁選擇

• Back

54

Page 55: Modern Operating System  Kernels

先進新出演算法(FIFO)

• 顧名思義,此演算法就是將最先寫入記憶體的頁面替換出去,此演算法的概念是把待在記憶體中最久的頁面替換出去,但實際上會造成許多不必要的 Swap in 和Swap out ,所以在實作上這個演算少被單獨使用!

55

Page 56: Modern Operating System  Kernels

FIFO Example

56

Page 57: Modern Operating System  Kernels

FIFO 另一缺點

理想情況 Belady’s Anomaly

FIFO 會引起 Belady’s Anomaly 的情況 57

back

Page 58: Modern Operating System  Kernels

第二次機會演算法

(The Second Chance Page Replacement Algorithm)

• 對於 FIFO 的改進,每個頁面都多一個存取位元 R ,每次頁面被使用時變將存取位元R 設為 1

• 替換時從佇列開頭開始尋找若他的存取位元 R 為 0 ,就置換出去,若 R=1 則將此頁面移到佇列尾巴,並將 R 設為 0

58

Page 59: Modern Operating System  Kernels

第二次機會演算法

(The Second Chance Page Replacement Algorithm)

0

A B C D E F G H

AB C D E F G H

3 7 8 12 14 15 18

3 7 8 12 14 15 18 20

( a)

( b)

最先載入的頁 最常參考的頁

視 A如新載入的分頁參考位元 0

參考位元 1

59

Page 60: Modern Operating System  Kernels

時鐘頁面替換演算法

The Clock Page Replacement Algorithm

• 此為第二次機會替換演算法的最佳化,作法是多一個指標,指在時間上最早加入的頁面,檢查時從指標指到的位置開始尋找,倘若頁面的存取位元 R=1只需將指標往下移並將 R 設成 0即可

• 此演算法跟第二次機會替換演算法概念是一模一樣,只是實作上不同而已!

• Back

60

Page 61: Modern Operating System  Kernels

第二次機會頁面替換演算法 (The Second Chance Page Replacement

Algorithm)(The Clock Page Replacement Algorithm)

C

參考位元 0

參考位元 1

L B

D

E

FG

H

I

A

J

K

61

Page 62: Modern Operating System  Kernels

LRU(The least Recently Used Page Replacement Algorithm)

• 這個演算的概念是當要換出一個頁面時,他會優先考慮最近不常使用的頁面

• 他的想法是利用紀錄去推算未來可能會被使用的頁面,以達到 Optimal

• NRU 和 LRU 並不一樣! NRU 是利用存取位元和修改位元來做出選擇,而 LRU 在實作時要求能夠找到最久沒有使用過的頁面這需要一個頁面串列來實作,也因此這個演算法 Cost高,且難以靠硬體實作!

62

Page 63: Modern Operating System  Kernels

LRU Example

63

Back

Page 64: Modern Operating System  Kernels

NFU(The Not Frequently Used Page Replacement)

• 這個演算法的概念與 LRU 一致,他主要是提供了一種軟體實作。

• 作法是對一個 Page 都擁有一個 Counter ,而每當時鐘中斷時,便將每個 page 的存取位元 R 之值 (0 or 1) 加到 Counter 上,所以經常被使用的 Page 之 Counter 值會比較大,反之 Counter 較小

• 然而因為此演算法的 Counter 的值只增不減,會成歷史會永久影響替換演算法的決策!

64

Page 65: Modern Operating System  Kernels

頁面老化演算法Page aging algorithm

• 此為對 NFU 演算的的改進版• 作法是每次時鐘中斷時,將 Counter 的值右移

一個 Bit 並將存取位元 R 加到最左邊的位元上• 由於此演算法的 Counter 的 Bit 是有限的,所

以並不是相當精準,但能消除歷史的影響!

65

Page 66: Modern Operating System  Kernels

工作集Working Set

• 程式執行時,對於存取的 memory area 並非均勻的,而是具某種集中 /局部存取的特性

• 而一段時間內所存取的 Page 變稱為「工作集」• 我們記錄工作集穩定下來某一時刻的工作集,當

下次該 process 被啟動時直接為這些 page賦予實體記憶體進而加快啟動速度。 Windows 將這種最佳化手段稱為 Logical Prefetcher

66

Page 67: Modern Operating System  Kernels

工作集Working Set

• 工作集在實作上一種簡單的作法就是記錄每個頁面最近被存取的時間,根據預設時間 t ,一旦目前時間超過某頁面最近被存取的時間再上 t 則將該頁面去除

• 利用 Working set我們可以改良上述的替換演算法 ;如時鐘替換演算中如果目前的指標指到的 page 的存取位元為 0 ,則該被置換,但加上 working set後才需考慮此 page 是否屬於working set

67

Page 68: Modern Operating System  Kernels

4.2 Windows 系統記憶體管理

68975002538 資工 4B 江瑞敏

Page 69: Modern Operating System  Kernels

Outline

• 1. windows memory 初始化 phase 0• 2. windows memory 初始化 phase 1• 3. 非分頁集區管理演算法• 4. 分頁集區管理演算法

69

Page 70: Modern Operating System  Kernels

windows memory 初始化 phase 0

70

Page 71: Modern Operating System  Kernels

Windows 開機流程

71

Page 72: Modern Operating System  Kernels

ntldr• 1. 初始化系統的環境,讓 windows kernel 可

以從 protected mode 的情況下開始執行。• 2. ntldr 可以拆成兩個部分 :

oReal mode code o PE format code

• 3. Segmentation 在 Real Mode code 初始化

• Paging 在 Protected Mode 初始化

72

Page 73: Modern Operating System  Kernels

Windows Segmentation - Init

- lgdt 0x15a8- ……..- Movl %cr0, %eax- Or $0x01, %eax- Mov %eax, %cr0

73

Page 74: Modern Operating System  Kernels

Windows Segmentation(cont.)

• 1. CS:0x8• 2. SS:0x10• 3. DS, ES:0x23• 4. FS:0x30

74

Page 75: Modern Operating System  Kernels

Windows Segmentation(cont.)

selector Descriptor address

Descriptor content

Segment base addr

Maximum Offset

CS 0x8003f008 Ffff 0000 9b00 00cf

0x0 0xfffff000

SS 0x8003f010 Ffff 0000 9300 00cf

0x0 0xfffff000

DS ES 0x8003f020 Ffff 0000 f300 00cf

0x0 0xfffff000

FS 0x8003f030 0001 f000 93df ffc0

0xffdff000

0x00001000

75

Page 76: Modern Operating System  Kernels

Windows Segmentation - Conclution

• 1. Windows 並沒有使用 Segmentation 的機制。 (Same as Linux)

• 2. 除了 FS 這個 register 以外,其他segment registers 都是從 0 到 4GB 。

76

Page 77: Modern Operating System  Kernels

Paging - Init

• mov eax, [page_directory] • mov cr3, eax   • mov eax, cr0 • or eax, 0x80000000 • mov cr0, eax

77

Page 78: Modern Operating System  Kernels

Translation table mapping

pfn

PDE

pa

0x200 0x30

0

400

800

100

1000

16MB

……

……

0x80000000

78

Page 79: Modern Operating System  Kernels

KiSysemStartup• KiSysemStartup -> KiInitializekernel

在啟動處理器 ( P0 ) 上執行全域範圍的核心初始化

• KiInitializekernel -> ExpInitializeExecutive 對執行體進行初始化

• ExpInitializeExecutive -> MmInitSystem 初始化執行體子元件

• e.g. , 記憶體管理員

79

Page 80: Modern Operating System  Kernels

MmInitSystem - Introduction

• 1. MmInitSystem 主要分成三個階段 :Phase 0Phase 1Phase 2

80

Page 81: Modern Operating System  Kernels

重要的資料結構

• 1. MMPTE• 2. MMPTE_HARDWARE• 3. LOADER_PARAMETER_BLOCK• 4. MM_FREE_POOL_ENTRY• 5. MEMORY_ALLOCATION_DESCRIPTOR

81

Page 82: Modern Operating System  Kernels

MMPTE

82

Page 83: Modern Operating System  Kernels

Page table format(intel manual)

83

Page 84: Modern Operating System  Kernels

MMPTE_HARDWARE

84

Page 85: Modern Operating System  Kernels

與 page table 相關的 macro

85

Page 86: Modern Operating System  Kernels

Windows Page Table Self-Mapping

• 1. Windows 用一個非常獨特的方法去管理 Process 的page table

• 2. 一般情況下系統需要 4mb+4kb 的大小來儲存整個translation table

• 3. Windows 指使用了 4mb 來儲存,並且運用自對應的技巧,以及位置的設定,使其能更容易得取得 page directory 和 page table 的 virtual address

Page 87: Modern Operating System  Kernels

Windows Page Table Self-Mapping

…..…..…..

PDE

…..………..

0xc0000000

0xc0030000

0xc0040000

Virtual address

4mb

Page table

0x0 0x1 0x2 ……… 0x300

……… PDE ……..

Page Tabe 4MB

PDE

0xc0000000

0xc0040000

0xc0030000

Page 88: Modern Operating System  Kernels

_LOADER_PARAMETER_BLOCK

88

Page 89: Modern Operating System  Kernels

_MMFREE_POOL_ENTRY

89

Page 90: Modern Operating System  Kernels

_MEMORY_ALLOCATION_DESCRIPTOR

90

Page 91: Modern Operating System  Kernels

List Entry

91

Page 92: Modern Operating System  Kernels

B F B F B F B F

Listhead

Blink Entry

Entry = ListHead->Blink; Blink = Entry->Blink; ListHead->Blink = Blink; Blink->Flink = ListHead; return Entry;

RemoveTailList

92

Page 93: Modern Operating System  Kernels

B F B F B F B F

Listhead

FlinkEntry

Entry = ListHead->Flink; Flink = Entry->Flink; ListHead->Flink = Flink; Flink->Blink = ListHead; return Entry;

RemoveHeadList

93

Page 94: Modern Operating System  Kernels

B F B F B F B F

BlinkListhead

Entry

Blink = ListHead->Blink; Entry->Flink = ListHead; Entry->Blink = Blink; Blink->Flink = Entry; ListHead->Blink = Entry;

InsertTailList

94

Page 95: Modern Operating System  Kernels

B F B F B F B F

FlinkEntry Listhead

Flink = ListHead->Flink; Entry->Flink = Flink; Entry->Blink = ListHead; Flink->Blink = Entry; ListHead->Flink = Entry;

InsertHeadList

95

Page 96: Modern Operating System  Kernels

CONTAINING_RECORD

• 1. List_Entry 是一個 double link list• 2. 在 Windows 的設計中, List_Entry 可以指向不同的 data

structure.• Ex. • Foo Bar

List_Entry Flink Blink

List_Entry Flink Blink

如何取得 Bar 的 base address

Page 97: Modern Operating System  Kernels

CONTAINING_RECORD

• #define CONTAINING_RECORD(address, type,field)

• ((type *)( (PCHAR)(address) – • (ULONG_PTR) (&((type *)0)->field)))

name

(20 bytes)

teacher

(20 bytes)

student

(4 bytes)

list_entry flink

blink

address

offset

97

Structure Base address

Page 98: Modern Operating System  Kernels

Phase 0

• 1. Phase 0 的目的主要是將系統的 Global Variables 做初始化的動作。

• 2. MmInitSystem 主要的功能便是初始化一些系統Global Variables

• 3. MiInitMachineDependent 主要的功能是讓Windows 的 Virtual Address System 運作起來。

98

Page 99: Modern Operating System  Kernels

MiInitMachineDependent – Phase 0

• 1. 紀錄 cr3 到 current process• 2. 計算系統總共的 free memory• 3. 調整全域變數 MmSizeOfNonPagedPoolInBytes

and MmMaximumNonPagedPoolInBytes• 4. 計算 MmNonPagedPoolStart 的位置• 5. 計算那些區塊需要使用大分頁對應 (如 PFN資料庫,

Kernel code 等等 ) ,以供 phase 1 使用• 6. 分配系統 PTE 和擴充的非分頁集區位置• 7. 初始化非分頁集區以及分頁集區資料結構

99

Page 100: Modern Operating System  Kernels

MiInitMachineDependent 0

• 將 PDE 的 base addresss 記錄到 current process 。• Current Process 為 Idle Process• PDE_BASE = 0xC0300000• DirBase = PdePageNumber

100

Page 101: Modern Operating System  Kernels

MiInitMachineDependent 1

• 將 Idle Process 0~2GB 的 virtual address space 設置為 0

• KSEG0_BASE = 2GB• P.S 0~2GB 是 user space 在 idle process

並不會用到

101

Page 102: Modern Operating System  Kernels

Find Free Memory Space

102

Page 103: Modern Operating System  Kernels

Find Free Memory Space (cont.)

103

Page 104: Modern Operating System  Kernels

Find Free Memory Space (cont.)

• 當這個步驟完成以後,以下的 Global Variables就會被設定好。

• MmNumberofPhysicalPages• MmLowestPhysicalPage• MmHighestPhysicalPage• MxFreeDescriptor

104

Page 105: Modern Operating System  Kernels

分頁表的對應• 分配系統 PTE 和擴充非分頁集區位置範圍的分頁表

105

Page 106: Modern Operating System  Kernels

MiInitializeNonPagedPool - intro

• 1. 初始化 MmNonPagedPoolFreeListHead• 2. 將 MMPTE_POOL_ENTRY FirstEntry Inset 到

MmNonPagedPoolFreeListHead[index] 中• 3. 將其餘的 FreeEntry owner field 指到 FirstEntry• 4. 紀錄 MiStartOfInitialPoolFrame 以及

MiEndOfInitialPoolFrame

Page 107: Modern Operating System  Kernels

MiInitializeNonPagedPool 0

• 初始化 MmNonPagedPoolFreeListHead• MI_MAX_FREE_LIST_HEADS = 4;

107

Page 108: Modern Operating System  Kernels

MiInitializeNonPagedPool 0

• MmNonPagedPoolFreeListHead

3 2 1 0 FlinkBlink

FlinkBlink

FlinkBlink

FlinkBlink

Page 109: Modern Operating System  Kernels

MiInitializeNonPagedPool 1

109

Page 110: Modern Operating System  Kernels

MiInitializeNonPagedPool 1

• MMPTE_POOL_ENTRY FirstEntry = FreeEntry

3 2 1 0 FlinkBlink

FlinkBlink

FlinkBlink

FlinkBlink

List Size Signature owner

MmNonPagedPoolFreeListHead

Page 111: Modern Operating System  Kernels

MiInitializeNonPagedPool 2

• 將空閒頁面串聯起來

111

Page 112: Modern Operating System  Kernels

List Size Signature owner

List Size Signature owner

List Size Signature owner

List Size Signature owner

FreeEntry

FreeEntry

FreeEntry

FreeEntryFirstEntry

Page 113: Modern Operating System  Kernels

3 2 1 0 FlinkBlink

FlinkBlink

FlinkBlink

FlinkBlink

List Size Signature owner

List Size Signature owner

List Size Signature owner

List Size Signature owner

MmNonPagedPoolFreeListHead

FirstEntry

FreeEntry

FreeEntry

FreeEntry

FreeEntry

Page 114: Modern Operating System  Kernels

MiInitializeNonPagedPool 3

設定 MiStartOfInitialPoolFrame

114

Page 115: Modern Operating System  Kernels

MiInitializeNonPagedPool 4

設定 MiEndOfInitialPoolFrame

115

Page 116: Modern Operating System  Kernels

核心、 HAL 等系統模組的映象區

PFN 資料庫

非分頁集區

系統快取額外區

系統 PTE 額外區

系統檢視

工作階段空間

分頁表

超空間和行程工作集

系統快取結構

系統快取

分頁集區

系統 PTE 區域

非分頁集區擴充區

當機轉存區

保留區

0x80000000

MmPfnDatabase

MmNonPagedPoolStartMiSystemCacheStartExtra

MiSystemViewStart

MmSeesionBase

0xc00000000xc0400000

MmSystemCacheWorkingSetListMmSystemCacheStart

MmPagedPoolStart

MmNonPagedSystemStartMmNonPagedExpansionStart

0xffbe0000

0xffffffff

MiMaximumSystemCacheSizeExtra( 個頁面 )

116

Page 117: Modern Operating System  Kernels

全域變數名 典型取值 全域變數名 典型取值MmHighestUserAddress 0x7ffeffff MiSessionImageStart 0xbf80000

0MmUserProbeArresss 0x7fff0000 MiSessionImageEnd 0xc00000

00MmSystemRangeStart 0x8000000

0MmSystemPteBase 0xc00000

00MmPfnDatabase 0x8100000

0MmWorkingSetList 0xc05020

00MmNonPagedPoolStart 0x8130100

0MmHyperSpaceEnd 0xc0bfffff

MmNonPagedPoolEnd0 0x82000000

MmSystemCacheWorkingSetList

0xc0c00000

MiSystemCacheSizeExtra 0x82000000

MmSystemCacheStart 0xc1000000

MiMaximumSystemCacheSizeExtra

0x2f800 MmpagedPoolStart 0xc1000000

MiSystemViewStart 0xbb000000

MmpagedPoolEnd 0xf0bfffff

MmSessionBAse 0xbc000000

MmNonPagedSystemStart 0xf0c00000

MmSessionPoolStart 0xbc000000

MmNonPagedPoolExpansionStart

0xf8ba0000

MiSessionViewStart 0xbc400000

MmNonPagedPoolEnd 0xffbe0000

MisessionSpaceWs 0xbf400000

MmNumberOfPhysicalPages 0x0001ff7a

117

Page 118: Modern Operating System  Kernels

Windows memory 初始化 phase 1

&非分頁集區管理演算法

975002536 資工 4B 張嘉顯

118

Page 119: Modern Operating System  Kernels

Phase1 – 流程• MiInitMachineDependent• 設定全域變數 MmSharedUserDataPte• 初始化工作階段空間

o MiSessionWideInitializeAddresso MiInitializeSessionWsSupporto MiInitializeSessionIds

• 啟動平衡集管理員o KeBalanceSetManagero KeSwapProcessOrStack

119

Page 120: Modern Operating System  Kernels

MiInitMachineDependent – Phase1

• 全域陣列 MiLargeVaRanges紀錄要轉成大頁面的區域• 可能包涵 核心本身映像區、 PFN資料庫、非分頁集區

120

Page 121: Modern Operating System  Kernels

MxConvertToLargePage

121

Page 122: Modern Operating System  Kernels

MxConvertToLargePage

• 將 PTE 整合成一個大頁面 (4MB)

122

Page 123: Modern Operating System  Kernels

Phase1 - MmSharedUserDataPte

• MmInitSystem 向分頁集區申請一個 PTE• MmSharedUserDataPte 指向該 PTE• 對應到 0xffdf0000

123

Page 124: Modern Operating System  Kernels

Phase1 – 0x7ffe0000• 將 0x7ffe0000 和 0xffdf0000 對應到同一個實體頁面上

124

Page 125: Modern Operating System  Kernels

為什麼要對應到同一個實體頁面

• 使用者模式程式碼可以存取系統的一些狀態資料,如 process 的資訊或 thread 的資訊

• Windows software interrupt(SYSENTER) 時也會用到此區域

125

Page 126: Modern Operating System  Kernels

非分頁集區

• 使用MiAllocatePoolPages、MiFreePoolPages申請和歸還頁面

• 包凡系統 PTE 區域、非分頁集區擴充區• 永遠都有實體的記憶體與之對應

126

Page 127: Modern Operating System  Kernels

127

Page 128: Modern Operating System  Kernels

Allocation 流程• 1. Loop 過 MmNonPagedPoolListHead[index]• 2. 如果其中一個 index 的 FirstEntry Size field 夠大的話,便分配那個區段並回傳其 virtual address

• 3. 如果 Size field > 需求的頁面,便會將後面的freeEntry 分配出去

• 4. 並且重新計算總共有幾個頁面,並且鍵結到相對應的MmNonPagedPoolListHead[index]

Page 129: Modern Operating System  Kernels

3 2 1 0 FlinkBlink

FlinkBlink

FlinkBlink

FlinkBlink

MmNonPagedPoolFreeListHead

現在總共有連續的六個頁面使用者需求三個

從 index 2 開始找起直到找到足夠的頁面

由於 index 2 沒有東西,所以從 index 3 去抓取頁面

Index 3 的 FirstEntry 有六個頁面,Page Size > Require Page分配後面三個頁面給使用者

由於只剩下三個連續頁面,所以便 link 到 index 2

Page 130: Modern Operating System  Kernels

MiFreePoolPage 流程• 1. 判斷歸還的頁面數目以及位置是否與現有的 Virtual

Address 連續o True: 將頁面合併,並且鍵結到相對應的 MmNonPagedPoolListHead[index] index = 合併後的頁面數目 - 1o False: 將歸還的頁面,鍵結到相對應的 MmNonPagedPoolListHead[index] index = 歸還的頁面數目 -1

Page 131: Modern Operating System  Kernels

3 2 1 0 FlinkBlink

FlinkBlink

FlinkBlink

FlinkBlink

MmNonPagedPoolFreeListHead

系統回收兩個頁面判斷與現有的頁面是否連續

如果不連續回收的頁面,鍵結到相對應的MmNonPagedPoolListHead[index]Index = 回收頁面 - 1

Page 132: Modern Operating System  Kernels

3 2 1 0 FlinkBlink

FlinkBlink

FlinkBlink

FlinkBlink

系統回收兩個頁面

判斷與現有的頁面是否連續

如果連續將回收的頁面與原本的頁面結合

並將結合完的頁面鍵結到相對應的MmNonPagedPoolListHead[index]Index = 回收頁面 - 1

Page 133: Modern Operating System  Kernels

系統分頁集區的管理演算法

975002530 資工 4B 林賢勁

133

Page 134: Modern Operating System  Kernels

核心、 HAL 等系統模組的映象區

PFN 資料庫

非分頁集區

系統快取額外區

系統 PTE 額外區

系統檢視

工作階段空間

分頁表

超空間和行程工作集

系統快取結構

系統快取

分頁集區

系統 PTE 區域

非分頁集區擴充區

當機轉存區

保留區

0x80000000

MmPfnDatabase

MmNonPagedPoolStartMiSystemCacheStartExtra

MiSystemViewStart

MmSeesionBase(0xbc000000)

0xc00000000xc0400000

MmSystemCacheWorkingSetListMmSystemCacheStart

MmPagedPoolStart

MmNonPagedSystemStart(0xf0c00000)MmNonPagedExpansionStart

0xffbe0000

0xffffffff

MiMaximumSystemCacheSizeExtra( 個頁面 )

134

Page 135: Modern Operating System  Kernels

全域變數

• 紀錄分頁集區起始位置o MmPagedPoolStart ( 系統全域 ) 0xe1000000o MiSessionPoolStart (工作階段 ) 0xbc000000

• 儲存分頁集區的大小o MmSizeOfPagedPoolInBytes ( 大小 ) o MmSizeOfPagedPoolInPages (Index)MmSizeOfPagedPoolInPages = MnSizeOfPagedPoolInBytes

>> PAGE_SHIFT;

135

Page 136: Modern Operating System  Kernels

typedef struct _MM_PAGED_POOL_INFO{PRTL_BITMAP PagedPoolAllocationMap;PRTL_BITMAP EndOfPagedPoolBitmap;PMMPTE FirstPteForPagedPool;PMMPTE LastPteForPagedPool;PMMPTE NextPdeForPagedPoolExpansion;ULONG PagedPoolHint;SIZE_T PagedPoolCommit;SIZE_T AllocatedPagedPool;

}MM_PAGED_POOL_INFO, *PMM_PAGED_POOL_INFO;

136

Page 137: Modern Operating System  Kernels

typedef struct _RTL_BITMAP { ULONG SizeOfBitMap; // Number of bits in bit map PULONG Buffer; // Pointer to the bit map itself} RTL_BITMAP;typedef RTL_BITMAP *PRTL_BITMAP;

137

Page 138: Modern Operating System  Kernels

MmInitSystem

MiBuildPagedPool

MmPagedPoolInfo ‘s member

call

initialize

PagedPoolAllocationMap

EndOfPagedPoolBitmap

FirstPteForPagedPool

LastPteForPagedPool

NextPdeForPagedPoolExpansion

PagedPoolHint

PagedPoolCommit

AllocatedPagedPool

建立

138

Page 139: Modern Operating System  Kernels

PagedPool 位置範圍

• MmPagedPoolStart 0xe1000000• MmPagedPoolEnd 0xf0bfffff

分別紀錄分頁集區的起始位址與結束位址

PointPte =MiGetPteAddress(MmPagedPoolStart);MmPagedPoolInfo.FirstPteForPagedPool =

PointerPte;MmPagedPoolInfo.LastPteForPagedPool =

MiGetPteAdress(MmPagedPoolEnd);

139

Page 140: Modern Operating System  Kernels

NextPdeForPagedPoolExpansion 000000

140

Page 141: Modern Operating System  Kernels

分配與回收

• MiAllocatePoolPages

• MiFreePoolPages

141

Page 142: Modern Operating System  Kernels

MiAllocatePoolPages

• 依據 PoolType 參數 去找到記憶體集區MM_PAGED_POOL_INFO結構系統分頁集區 (MmPagedPageInfo)工作階段空間的 Paged pool (MmSessionSpace -> PagedPoolInfo)

142

Page 143: Modern Operating System  Kernels

• Call RtlFindClearBitsAndSet搜尋指定數量的連續零位元

• 如果找到上述的零位元就 paged pool 中對應之連續空閒頁面

• 如果無法NextPdeForPagedPoolExpansion成員往後移 ( 擴充分頁集區 )

143

Page 144: Modern Operating System  Kernels

MiFreePoolPages• 先用 PagedPoolInfo 中的兩個 BitMap 做驗證 StartingAddress 的有效性 PagePoolAllocationMap EndOfPagedPoolBitmap

• 若有效 修改兩個 BitMap ,並維護 PagedPoolInfo-

>AllocatedPagedPool 和 PagedPoolInfo->PagedPoolCommit

• 若無效• Bugcheck( 系統當機 )

144