18.11.2014 Views

Using Virtual Memory in your application

Using Virtual Memory in your application

Using Virtual Memory in your application

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Us<strong>in</strong>g</strong> <strong>Virtual</strong> <strong>Memory</strong> <strong>in</strong><br />

<strong>your</strong> <strong>application</strong>


Introduce to W<strong>in</strong>dows <strong>Memory</strong><br />

Management<br />

• W<strong>in</strong>dows 了 理 <br />

• <strong>Virtual</strong> <strong>Memory</strong><br />

• 理 列 列 <br />

• <strong>Memory</strong>-Mapped Mapped File<br />

• 料 串 流 ()) , 料 <br />

<br />

• Heap<br />

• 理 量 料 <br />

• <strong>Virtual</strong> <strong>Memory</strong> <br />

1<br />

Reserv<strong>in</strong>g<br />

• 留 <br />

<br />

<br />

2 3<br />

Commit<br />

Read/Write


W<strong>in</strong>32 理 <br />

料 來 : ms-help://MS.MSDNQTR.2004JAN.1033/dngenlib/html/msdn_virtmm.htm


Reserv<strong>in</strong>g a Region <strong>in</strong> an Address Space<br />

NULL <br />

<br />

<br />

<br />

bytes<br />

bytes<br />

(<br />

(<br />

Page<br />

Page<br />

size<br />

size<br />

<br />

<br />

數 )<br />

)<br />

Reserv<strong>in</strong>g <br />

MEM_COMMIT<br />

MEM_COMMIT<br />

<br />

<br />

MEM_RESERVE<br />

MEM_RESERVE<br />

留 <br />

<br />

;<br />

;<br />

PAGE_READWRITE<br />

PAGE_READWRITE<br />

• 列 , <strong>Virtual</strong>Alloc NULL ((<br />

)<br />

• <br />

<br />

• 不 user-mode partition <br />

W<strong>in</strong>dows 2000 user-mode partition : 0x00010000-0x7FFEFFFF<br />

W<strong>in</strong>dows 98 user-mode partition : 0x00400000-0x7FFFFFFF


Reserv<strong>in</strong>g <br />

PVOID buffer=<strong>Virtual</strong>Alloc((LPVOID)0x003c0000,<br />

64*1024,MEM_RESERVE, PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

return 0;<br />

(bytes) (bytes)<br />

Reserv<strong>in</strong>g <br />

Reserv<strong>in</strong>g<br />

, 不 <br />

, 0x003c0000 <br />

不 <br />

讀 <br />

0x00010000-0x7FFEFFFF ,


?<br />

• <strong>Virtual</strong>Query


來 例<br />

void ma<strong>in</strong>(){<br />

// Step 1: 0x003c0000 狀 <br />

Show<strong>Memory</strong>Status((LPVOID)0x003c0000);<br />

<br />

<br />

<br />

<br />

}<br />

PVOID buffer=<strong>Virtual</strong>Alloc((LPVOID)0x003c0000,<br />

64*1024,MEM_RESERVE,<br />

PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

<br />

<br />

// Step 2: 0x003c0000+ page 狀 <br />

<br />

Show<strong>Memory</strong>Status((LPVOID)(0x003c0000+4*1024));


料 來<br />

<strong>Virtual</strong>Query


COMMIT <br />

• 若 ,<br />

• Reserv<strong>in</strong>g , COMMIT<br />

PVOID buffer=<strong>Virtual</strong>Alloc((LPVOID)0x003c0000,<br />

64*1024,MEM_COMMIT, PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

return 0;<br />

<br />

PVOID buffer=<strong>Virtual</strong>Alloc((LPVOID)0x003c0000, 1 reserve reserve<br />

64*1024,MEM_RESERVE, PAGE_READWRITE);<br />

buffer=<strong>Virtual</strong>Alloc((LPVOID)0x003c0000,<br />

64*1024,MEM_COMMIT, PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

return 0;<br />

2 commit commit<br />

, 不 <br />

, 不 了


論<br />

• , <strong>Virtual</strong>Alloc 來 <br />

• granularity boundary (64KB) <br />

1<br />

void ma<strong>in</strong>(){<br />

64 KB 說 <br />

300 300 ** 64 64 K + 8192 8192<br />

PVOID buffer=<strong>Virtual</strong>Alloc((LPVOID)(300 * 65536+8192),<br />

64*1024,MEM_RESERVE,<br />

PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

}<br />

2<br />

300 300 ** 64 64 K <br />

(8192 (8192 ) )


Reserve 略<br />

• 留 , <br />

. <br />

<br />

void ma<strong>in</strong>(){<br />

料<br />

}<br />

PVOID buffer=<strong>Virtual</strong>Alloc(NULL,<br />

98 98 不 <br />

64*1024,MEM_RESERVE | MEM_TOP_DOWN ,<br />

PAGE_READWRITE);


• <br />

Protected <br />

• PAGE_NOACCESS, PAGE_READWRITE,<br />

PAGE_READONLY,<br />

• PAGE_ EXECUTE, , PAGE_EXECUTE<br />

EXECUTE_READ,<br />

PAGE_EXECUTE<br />

EXECUTE_READWRITE<br />

98 98 不 <br />

W<strong>in</strong>dows 98 <br />

PAGE_ EXECUTE, PAGE_EXECUTE_READ PAGE_READONLY<br />

PAGE_EXECUTE_READWRITE PAGE_READWRITE


Committ<strong>in</strong>g<br />

<br />

Reserve <br />

• <br />

Commit , 行 <br />

• page file <br />

Reserve <br />

void ma<strong>in</strong>(){<br />

}<br />

• <br />

page (4 KB)<br />

Step Step 1: 1: Reserv<strong>in</strong>g Reserv<strong>in</strong>g <br />

PVOID buffer=<strong>Virtual</strong>Alloc(NULL,<br />

64*1024,MEM_RESERVE, PAGE_READWRITE);<br />

buffer=<strong>Virtual</strong>Alloc(buffer,<br />

4*1024,MEM_COMMIT, PAGE_READWRITE);<br />

,page<br />

page page commit<br />

Step Step 2: 2:


例<br />

void ma<strong>in</strong>(){<br />

// Step 1: Reserve 64 KB <br />

PVOID buffer=<strong>Virtual</strong>Alloc(NULL, 64*1024,MEM_RESERVE,PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

// Step 2: , 1 page <br />

buffer=<strong>Virtual</strong>Alloc(buffer, 4*1024,MEM_COMMIT,PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

<br />

Page protected <br />

PAGE_READONLY<br />

// Step 3: 例<br />

for(<strong>in</strong>t i=0;i


• 若 5,242,880<br />

5,242,880<br />

Reserve<br />

512 kB , commit <br />

5,242,880 + 2k 6KB<br />

<br />

5,242,880+2k<br />

512k<br />

5,242,880<br />

6KB<br />

Commit Commit <br />

<strong>Virtual</strong>Alloc((PVOID) (5242880 + (2 * 1024)), 6 * 1024,<br />

MEM_COMMIT, PAGE_READWRITE);<br />

page page <br />

<br />

4KB 4KB<br />

4KB 4KB<br />

5,242,880 ~ 5,242,880 + 8k-1 <br />

8 kB<br />

<br />

<br />

page page 數


1. Reserve <br />

2. 行 Commit<br />

不 ?<br />

理 !! !!<br />

<strong>Virtual</strong>Alloc((PVOID) (NULL, 99 * 1024,<br />

MEM_RESERVE| MEM_COMMIT, PAGE_READWRITE);<br />

100 kB <br />

Why ?<br />

page size(4KB) 數 <br />

: 若 不 , NULL


COMMIT <br />

• <br />

128 bytes<br />

CELLDATA CellData[200][256];<br />

128 128 * 200 200 * 256 256 = 6,553,600 = 64 64 KB KB<br />

數 , <br />

數 ,<br />


<strong>Virtual</strong> <strong>Memory</strong> <br />

<br />

• Reserv<strong>in</strong>g , 不 <br />

<br />

• <br />

料 , <br />

COMMIT Cell <br />

什 不 l<strong>in</strong>ked<br />

list 料 ?<br />

l<strong>in</strong>ked list 理 料 ,<br />


Commit <br />

Exception,<br />

略 Exception ,<br />

Commit


state Free 狀 <br />

<strong>Virtual</strong>Free( , 0 , MEM_RELEASE )<br />

state Reserve 狀 <br />

<strong>Virtual</strong>Free( , , MEM_DECOMMIT )<br />

page page


行 ,<br />

更 protected <br />

… <br />

什 ?<br />

Debug 便<br />

類 來 理 料<br />

1. 理 : memory PAGE_READWRITE<br />

2. 離 類 :<br />

memory PAGE_READONLY<br />

來 ,, ,<br />

Exception.


例<br />

void ma<strong>in</strong>(){<br />

// Step 1: Reserve & COMMIT 64 KB <br />

PVOID buffer=<strong>Virtual</strong>Alloc(NULL, 64*1024,MEM_RESERVE | \<br />

MEM_COMMIT,PAGE_READWRITE);<br />

if(buffer==NULL)<br />

ShowError();<br />

// Step 2:<br />

for(<strong>in</strong>t i=0;i


<strong>Memory</strong> Reset <br />

• , RAM 行 .<br />

• Page fault: <br />

page 不 RAM <br />

, page file 料 <br />

page RAM<br />

RAM.<br />

page<br />

RAM


RAM 不 <br />

• RAM <br />

(page),<br />

page file .<br />

• Page 料<br />

• 料 更 <br />

file .<br />

RAM page page file<br />

<br />

料 <br />

page page<br />

<br />

<br />

料 不 , <br />

了<br />

<strong>Memory</strong> Reset


• 料<br />

• , 料 不 了<br />

• Free , <br />

<br />

來 , <br />

<br />

<br />

不 care 料 了 .


<strong>in</strong>t _tma<strong>in</strong>(<strong>in</strong>t argc, _TCHAR* argv[]) {<br />

// Step 1: Reserve & COMMIT 64 KB <br />

PVOID buffer=<strong>Virtual</strong>Alloc(NULL, 64*1024,MEM_RESERVE |<br />

MEM_COMMIT,PAGE_READWRITE);<br />

if(buffer==NULL) ShowError();<br />

// Step 2: <br />

for(<strong>in</strong>t i=0;i


PINT pnData = (PINT) <strong>Virtual</strong>Alloc(NULL, 1024, MEM_RESERVE | MEM_COMMIT, \<br />

PAGE_READWRITE);<br />

pn[0] = 100;<br />

pn[1] = 200;<br />

<strong>Virtual</strong>Alloc((PVOID) pnData, sizeof(<strong>in</strong>t), MEM_RESET, PAGE_READWRITE);<br />

pnData 4 bytes Reset<br />

MEM_RESET ,<br />

<br />

RESET page (4KB) <br />

, <br />

, <br />

4092 bytes 料 lose


不 便 亂 <br />

<strong>Virtual</strong>Alloc((PVOID) pnData, 5000, MEM_RESET, PAGE_READWRITE);<br />

RESET ,<br />

<br />

<strong>Virtual</strong>Query<br />

RegionSize,<br />

RESET<br />

Reset<br />

MEMORY_BASIC_INFORMATION mbi;<br />

<strong>Virtual</strong>Query (pszData, &mbi, sizeof(mbi));<br />

<strong>Virtual</strong>Alloc(pszData, mbi.RegionSize, MEM_RESET, PAGE_READWRITE);<br />

Region Size


End


錄<br />

Global Local functions<br />

• 來 port<strong>in</strong>g 16-bit<br />

, 了 <br />

, heap functions <br />

• W<strong>in</strong>dows global local heap<br />

• GlobalAlloc = LocalAlloc<br />

• near far po<strong>in</strong>ter <br />

16- bits W<strong>in</strong>dows <br />

• 16-bit<br />

segmented memory model near/ far po<strong>in</strong>ters<br />

• 32- bit virtual memory model 律 32-bit<br />

<br />

• GlobalAlloc LocalAlloc 律 32-bit virtual address<br />

GlobalAlloc/ LocalAlloc heap bytes ,<br />

functions, .


• GlobalAlloc / LocalAlloc <br />

• private, committed pages with read/write access<br />

不 process <br />

process process file-map . .


Copy-On<br />

On-Write<br />

• W<strong>in</strong>dows<br />

, 兩 <br />

processes <br />

• 若 10 Notepad 行 , code data <br />

physical memory .<br />

• 行 <br />

• <strong>in</strong>stance ,<br />

.


Copy-On<br />

On-Write<br />

• OS 了 <br />

例 : : .data .data section section<br />

• .exe .dll<br />

memory , <br />

page 數 量 , copy-on<br />

on-write<br />

<br />

thread thread <br />

<br />

RAM RAM free free page page<br />

page page<br />

free free page page <br />

更 page page table table<br />

virtual virtual address address page page


更 <br />

<br />

Physical Physical memory memory<br />

<strong>Virtual</strong> <strong>Virtual</strong> <strong>Memory</strong> <strong>Memory</strong><br />

<strong>in</strong>stances , RAM RAM code <br />

data data map map process virtual virtual space space <br />

<br />

<br />

executable<br />

executable<br />

image<br />

image<br />

料 ,<br />

,<br />

<br />

<br />

兩 <strong>in</strong>stances<br />

<strong>in</strong>stances


<strong>in</strong>stance 更 shared<br />

shared 料<br />

Copy-on-Write<br />

Copy-on-Write<br />

<br />

<br />

<strong>in</strong>stance<br />

<strong>in</strong>stance<br />

page<br />

page<br />

table<br />

table<br />

<br />

<br />

page<br />

page<br />

<br />

<br />

<strong>in</strong>stance<br />

<strong>in</strong>stance<br />

<br />

<br />

<br />

來 page<br />

page<br />

• 來 , Process 1 更 <br />

global/static 數 , 不

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!