記憶體對映檔案

2021-06-09 16:09:33 字數 2237 閱讀 2389

//#include "stdafx.h"

#include #include #define buffsize 1024 //記憶體大小

#define file_map_start 0x28804 //檔案對映的起始位址

lptstr lpcthefile = text("test.dat");

int _tmain(int argc, _tchar* argv)

for( i = 0; i < 65535; i++)

dwfilesize = getfilesize(hfile,null);

printf("檔案大小: %d\n", dwfilesize);

//獲取系統資訊,記憶體分配粒度

//獲取分配粒度,進行下面計算

//目的是為了對映的資料與系統記憶體分配粒度對齊,提高記憶體的訪問效率

getsysteminfo(&sysinfo);

dwsysgran = sysinfo.dwallocationgranularity; // 65536 = 64kb

//分配的粒度是記憶體最小分配大小。

//比如你在0x10的地方申請分配4097個位元組的記憶體,

//那麼實際分配的大小是4097/4k+4k=8k的大小。

dwfilemapstart = (file_map_start / dwsysgran) * dwsysgran;

dwmapviewsize = (file_map_start % dwsysgran) + buffsize;

dwfilemapsize = file_map_start + buffsize;

//計算需要讀取的資料的偏移

iviewdata= file_map_start - dwfilemapstart;

null, //安全選項:預設

page_readwrite, //可讀,可寫

if( hmapfile == null)

lpmapaddress = mapviewoffile( hmapfile,

file_map_all_access,

0,dwfilemapstart,

dwmapviewsize);

if (lpmapaddress == null)

printf("檔案map view相當於檔案的起始位置: 0x%x\n",dwfilemapstart);

printf("檔案map view的大小: x%x\n",dwmapviewsize);

printf("從相對於map view 0x%x 位元組的位置讀取資料,", iviewdata);

//將指向資料的指標偏移,到達我們關心的地方

pdata = (pchar)lpmapaddress + iviewdata;

//讀取資料,賦值給變數

idata = *(pint)pdata;

printf("為: x%.8x\n",idata);

copymemory(cmapbuffer,lpmapaddress,32);

printf("lpmapaddress起始位元組是:");

for( i = 0; i < 32; i++)

fillmemory(lpmapaddress,32,(byte)0xff);

//將對映的資料寫回到硬碟上

flushviewoffile(lpmapaddress,dwmapviewsize);

printf("\n已經將lpmapaddress開始的位元組使用0xff填充");

if(!closehandle(hmapfile))

//關閉檔案

if(!closehandle(hfile))

printf("\n");

return 0;}/*

現代計算機讀取記憶體的時候,一般只能在偶數邊界上開始讀,

什麼意思呢,我們打個比方,在32位的機子上,乙個int變數

變數占用4位元組,假如這個變數的真實物理記憶體位址是0x400005,

那計算機在取數的時候會先從0x400004取4個位元組,

再從0x400008取4個位元組,然後這個變數的值就是前4個位元組的

後三位和後4個位元組的第一位,也就是說如果乙個變數的位址從

奇數開始,就可能要多讀一次記憶體,而如果落在從偶數開始,特

別是計算機位數/8的倍數開始,效率就高了

*/

記憶體對映檔案

記憶體對映檔案是利用虛擬記憶體把檔案對映到程序的位址空間中去,在此之後程序操作文 件,就像操作程序空間裡的位址一樣了,比如使用 memcpy 等記憶體操作的函式。這種方法能 夠很好的應用在需要頻繁處理乙個檔案或者是乙個大檔案的場合,這種方式處理 io效率比 普通 io效率要高。另外,unix 把它做...

記憶體對映檔案

記憶體對映檔案有三種,第一種是可執行檔案的對映,第二種是資料檔案的對映,第三種是借助頁面交換檔案的記憶體對映.應用程式本身可以使用後兩種記憶體對映.1.可執行檔案對映 windows在執行乙個win32應用程式時使用的是記憶體對映檔案技術.系統先在程序位址空間的0x00400000以上保留乙個足夠大...

記憶體檔案對映

一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應...