Windows記憶體管理(2) Lookaside

2021-09-06 04:01:24 字數 4353 閱讀 5898

1.lookaside結構

頻繁的申請和**記憶體,會導致在記憶體上產生大量的記憶體「空洞」,從而導致最終無法申請記憶體。

ddk為程式設計師提供了

lookaside

結構來解決這個問題。

我們可以將

lookaside

物件看成是乙個記憶體容器。在初始化的時候,它先向

windows

申請了一塊比較大的記憶體。以後程式設計師每次申請記憶體的時候,不是直接向

windows

申請記憶體,而是想

lookaside

物件申請記憶體。

looaside

會智慧型的避免產生記憶體「空洞」。如果

lookaside

物件內部記憶體不夠用時,它會向作業系統申請更多的記憶體。

lookaside

一般會在以下情況下使用:

1.      

程式設計師每次申請固定大小的記憶體。

2.      

申請和**的操作十分頻繁。

要使用looaside

物件,首先要初始化

lookaside

物件,有以下兩個函式可以使用:

1void

exinitializenpagedlookasidelist(

in pnpaged_lookaside_listlookaside,

in pallocate_functionallocateoptional,

in pfree_functionfreeoptional,

in ulongflags,

in size_tsize,

in ulongtag,

in ushortdepth

);

2void

exinitializepagedlookasidelist(

in ppaged_lookaside_listlookaside,

in pallocate_functionallocateoptional,

in pfree_functionfreeoptional,

in ulongflags,

in size_tsize,

in ulongtag,

in ushortdepth

);

初始化玩

lookaside

物件後,可以進行申請記憶體的操作了:

1pvoid

exallocatefromnpagedlookasidelist(

in pnpaged_lookaside_listlookaside

);

2pvoid

exallocatefrompagedlookasidelist(

in ppaged_lookaside_listlookaside

);

對lookaside

物件**記憶體:

1void

exfreetonpagedlookasidelist(

in pnpaged_lookaside_listlookaside,

in pvoidentry

)

2void

exfreetopagedlookasidelist(

in ppaged_lookaside_listlookaside,

in pvoidentry

);

在使用完

lookaside

物件後,要刪除

lookaside

物件:

1void

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就有這兩...