1.lookaside結構
頻繁的申請和**記憶體,會導致在記憶體上產生大量的記憶體「空洞」,從而導致最終無法申請記憶體。
ddk為程式設計師提供了
lookaside
結構來解決這個問題。
我們可以將
lookaside
物件看成是乙個記憶體容器。在初始化的時候,它先向
windows
申請了一塊比較大的記憶體。以後程式設計師每次申請記憶體的時候,不是直接向
windows
申請記憶體,而是想
lookaside
物件申請記憶體。
looaside
會智慧型的避免產生記憶體「空洞」。如果
lookaside
物件內部記憶體不夠用時,它會向作業系統申請更多的記憶體。
lookaside
一般會在以下情況下使用:
1.
程式設計師每次申請固定大小的記憶體。
2.
申請和**的操作十分頻繁。
要使用looaside
物件,首先要初始化
lookaside
物件,有以下兩個函式可以使用:
(1)void
exinitializenpagedlookasidelist(
in pnpaged_lookaside_listlookaside,
in pallocate_functionallocateoptional,
in pfree_functionfreeoptional,
in ulongflags,
in size_tsize,
in ulongtag,
in ushortdepth
);
(2)void
exinitializepagedlookasidelist(
in ppaged_lookaside_listlookaside,
in pallocate_functionallocateoptional,
in pfree_functionfreeoptional,
in ulongflags,
in size_tsize,
in ulongtag,
in ushortdepth
);
初始化玩
lookaside
物件後,可以進行申請記憶體的操作了:
(1)pvoid
exallocatefromnpagedlookasidelist(
in pnpaged_lookaside_listlookaside
);
(2)pvoid
exallocatefrompagedlookasidelist(
in ppaged_lookaside_listlookaside
);
對lookaside
物件**記憶體:
(1)void
exfreetonpagedlookasidelist(
in pnpaged_lookaside_listlookaside,
in pvoidentry
);
(2)void
exfreetopagedlookasidelist(
in ppaged_lookaside_listlookaside,
in pvoidentry
);
在使用完
lookaside
物件後,要刪除
lookaside
物件:
(1)void
exdeletenpagedlookasidelist(
in pnpaged_lookaside_listlookaside
);
(2) void
exdeletepagedlookasidelist(
in ppaged_lookaside_listlookaside
);
測試**:
#pragma
initcode
void
lookasidetets()
}for (int
i=0; i
<50; i++)
}exdeletepagedlookasidelist(&lookaside);
}
2.執行時函式(1
)記憶體間複製(非重疊)
void
rtlcopymemory(
invoid unaligned*destination,
in const void unaligned*source,
in size_tlength
);
(2
)記憶體間複製(可重疊)
void
rtlmovememory(
invoid unaligned*destination,
in const void unaligned*source,
in size_tlength
);
(3
)填充記憶體
void
rtlfillmemory(
in void unaligned*destination,
in size_tlength,
in ucharfill
);
void
rtlzeromemory(
in void unaligned*destination,
in size_tlength
);
(4
)記憶體比較
size_t
rtlcomparememory(
in const void*source1,
in const void*source2,
in size_tlength
);
ulong
rtlequalmemory(
const void *source1,
const void *source2,
size_tlength
);
測試**:
#define
buffer_size 1024
#pragma
initcode
void
rtltest()
}else
kdprint(("
離開rtltest函式!\n"));}
windows記憶體管理
32位平台下,cpu的定址能力為4gb,pc中有些裝置 如顯示卡 都提供自己的裝置記憶體,這部分記憶體會對映到pc的物理記憶體上,也就是讀寫這段物理記憶體位址,其實是在讀寫裝置記憶體位址,而不會讀寫物理記憶體位址。雖然提供了4gb的定址能力,但是實際可能沒有這麼大的物理記憶體,這樣就引入了虛擬記憶體...
Windows 記憶體管理
windows 2000 使用基於分頁機制的虛擬記憶體。每個程序有4gb的虛擬位址空間。基於分頁機制,這4gb位址空間的一些部分被映 物理記憶體,一些部分對映硬碟上的交換檔案,一些部分什麼也沒有對映。程式中使用的都是4gb位址空間中的虛擬位址。而訪問物理記憶體,需要使用實體地址。下面我們看看什麼是實...
Windows記憶體管理
虛擬位址空間 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x00000000 至 0x7fffffff。那麼什麼又是使用者模式?使用者模式與核心模式 這同樣是cpu的概念。cpu就有這兩...