Win3內存管理之私有內存跟共享內存的申請與釋放

      Win3內存管理之私有內存跟共享內存的申請與釋放

一丶內存簡介私有內存申請

  經過上一篇文章.咱們理解了虛擬內存與物理內存的區別. 那麼咱們有API事專門申請虛擬內存與物理內存的.windows

有私有內存跟共享內存. 私有內存的意思就是這塊內存申請只在本進程的物理頁當中. 共享內存就是這個物理頁 A B兩個進程均可以使用.api

私有內存申請API安全

  VirtualAlloc / virtualAllocExapp

LPVOID VirtualAlloc(  
LPVOID lpAddress, 你要申請的地址.能夠指定地址.可是物理頁咱們不知道那個地址是否存在.因此通常爲0 SIZE_T dwSize, 申請內存的大小.通常爲一個頁.雖然MSDN說了一Byte(字節) 爲主. 可是咱們知道物理內存是一個頁.因此申請一個頁便可. DWORD flAllocationType, 申請內存的類型. 是這樣的.咱們申請內存在物理頁. 能夠有兩種類型.一種類型就是物理內存直接申請.一種就是物理內存佔位置.並不申請.通常用第一種. DWORD flProtect 內存的狀態.咱們申請的內存狀態是可讀的 仍是可寫的. 仍是可讀寫的.

virtualAllocEx 是遠程內存申請.就是說咱們能夠經過指定的進程. 給這個指定進程申請內存.spa

 

new malloc的區別. 請注意.真正申請內存的實際上是API. 而new malloc 是申請堆內存. 意思就是說. new malloc其實就是在已申請的內存上面劃分出來了一塊虛擬內存給你使用.操作系統

無論你使用沒使用. 並且new關鍵字本質也就是malloc 只不過能夠進行構造. 而 malloc的底層是經過 HeapAlloc申請的. 並無進0環(內核)code

二丶共享內存申請

1.共享內存申請

  共享內存其實就是物理頁能夠共享使用了. A進程申請物理頁往這個物理頁填寫內容. B進程就能夠讀取了.對象

咱們具體的APIblog

  1. 申請物理頁內存API索引

    

HANDLE CreateFileMapping(  HANDLE hFile,                       文件映射.申請的物理頁能夠跟文件相映射.若是不須要文件只申請物理頁則不須要.
  LPSECURITY_ATTRIBUTES lpAttributes,                 SD安全屬性,每一個內核對象都須要的安全屬性
  DWORD flProtect,                                    權限.你申請的這個物理頁是可讀的可寫的仍是可讀寫.
  DWORD dwMaximumSizeHigh,                                     申請內存的高32位. windows爲了支持64我操做系統.因此給了高低32位來保存地址. 若是是32位地址.則不須要.填0便可.
  DWORD dwMaximumSizeLow,                             低32位,你要申請的物理頁內存的大小
  LPCTSTR lpName                                     進程共享物理頁的名字.若是但願這個物理頁B進程可使用則須要給一個名字.
返回值: 返回物理頁句柄索引.

有建立物理頁 也有打開物理頁 主要是B進程使用.

  

HANDLE OpenFileMapping(  DWORD dwDesiredAccess,  // access mode
  BOOL bInheritHandle,    // inherit flag
  LPCTSTR lpName          // object name);

固然若是B進程使用同樣可使用CreateFileMaping. 只不過會返回文件對象已經存在的錯誤.

2.線性地址(虛擬地址) 關聯物理頁.

  上面申請了物理頁.那麼咱們還須要將這個物理頁映射到線性地址.須要的API以下.

LPVOID MapViewOfFile( HANDLE hFileMappingObject, // 物理頁句柄
  DWORD dwDesiredAccess,       // 線性地址訪問權限,注意跟物理頁最好一直.或者比物理頁更嚴格.
  DWORD dwFileOffsetHigh,      // 映射線性地址的偏移位置 高32位
  DWORD dwFileOffsetLow,       // 低32位
  SIZE_T dwNumberOfBytesToMap  // 內存映射結束位置;

 

3.取消關聯

     

BOOL UnmapViewOfFile(  LPCVOID lpBaseAddress   // starting address); 虛擬地址

關閉物理頁映射則使用CloseHandle. PS: 知識 引用計數-1. 爲0了則會關閉.

 

具體代碼以下.

A進程B進程同樣. A進程寫入. B進程寫入.

  

// A.cpp : 定義控制檯應用程序的入口點。 //  #include "stdafx.h" #include <Windows.h>

int main() { getchar(); //A進程 申請物理頁
    HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, TEXT("共享內存")); //2.映射虛擬內存(線性地址的)
    LPVOID lpBuf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0x1000); // A進程寫內存
    *(char *)lpBuf = 'a';  //寫內存
    printf("寫入內存爲a \r\n"); getchar(); UnmapViewOfFile(lpBuf); CloseHandle(hMap); return 0; }

B進程代碼:

  

// A.cpp : 定義控制檯應用程序的入口點。 //  #include "stdafx.h" #include <Windows.h>

int main() { getchar(); //A進程 申請物理頁
    HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, TEXT("共享內存")); //2.映射虛擬內存(線性地址的)
    LPVOID lpBuf = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0x1000); // A進程寫內存
 printf("讀取內存爲 %c \r\n",*(char *)lpBuf); getchar(); UnmapViewOfFile(lpBuf); CloseHandle(hMap); return 0; }

這樣就實現了物理頁共享.

相關文章
相關標籤/搜索