Using Virtual Memory in your application
Using Virtual Memory in your application
Using Virtual Memory in your application
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<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 數 , 不