資料介紹
三、內(nèi)存管理
同其它Windows操作系統(tǒng)一樣,Windows CE.NET也支持32位虛擬內(nèi)存機(jī)制、按需分配內(nèi)存和內(nèi)存映射文件等。但是與其它Windows操作系統(tǒng)又有明顯的不同。畢竟Windows CE是一種嵌入式實(shí)時(shí)性的操作系統(tǒng),在內(nèi)存管理方面必須要比其它Windows操作系統(tǒng)更節(jié)約物理內(nèi)存和虛擬地址空間。在內(nèi)存管理API方面,為了便于移植程序,Windows CE和其它Windows操作系統(tǒng)函數(shù)聲明基本一致,這使一個(gè)在其它Windows下開發(fā)的程序員可以直接使用早就熟悉的API函數(shù), 但是CE下內(nèi)存管理的原理開發(fā)者還是應(yīng)該熟悉的。
1、ROM和RAM
最早的基于Windows CE的民用產(chǎn)品,采用的存儲(chǔ)設(shè)備都是ROM + RAM ,ROM保存CE內(nèi)核文件、應(yīng)用程序,而RAM用于內(nèi)核、所有應(yīng)用程序運(yùn)行時(shí)使用,關(guān)閉電源時(shí)必須給RAM提供電力來保存系統(tǒng)配置信息、用戶產(chǎn)生的文件等。為了適應(yīng)這樣的存儲(chǔ)硬件,CE采用了ROM文件系統(tǒng)和RAM文件系統(tǒng)。在ROM中存放的模塊可以是壓縮的,也可以是不壓縮的,這取決于OEM。OEM在定制內(nèi)核時(shí)可以設(shè)置是否壓縮模塊。如果是壓縮的,模塊在運(yùn)行前先解壓并全部存放到RAM中。如果是不壓縮的,就本地執(zhí)行(XIP,executed in place)。本地執(zhí)行和其它Windows操作系統(tǒng)下執(zhí)行應(yīng)用程序、DLL方式一致,也就是應(yīng)用了內(nèi)存映射文件技術(shù)。在這里我順便講一下。在啟動(dòng)時(shí)應(yīng)用程序或DLL的代碼段不加載到物理內(nèi)存中,內(nèi)核只是分配虛擬地址空間給代碼段,當(dāng)執(zhí)行代碼時(shí)內(nèi)核會(huì)到實(shí)際存放在硬盤上的文件中尋找代碼并執(zhí)行。采用這樣的技術(shù)既可以節(jié)省可用內(nèi)存又可以減少加載的時(shí)間。請(qǐng)注意,操作系統(tǒng)首先會(huì)到為硬盤準(zhǔn)備的緩沖區(qū)里讀取代碼數(shù)據(jù),如果沒有就命令硬盤讀取應(yīng)用程序文件數(shù)據(jù)到緩沖區(qū)。所以緩沖區(qū)設(shè)置大點(diǎn)是有好處的。Windows CE的本地執(zhí)行就是采用這樣的技術(shù)來加載ROM內(nèi)的應(yīng)用程序和DLL的。所以Windows CE的DLL分為XIP DLL和非XIP DLL。這種加載方式的缺點(diǎn)就是執(zhí)行相對(duì)較慢一點(diǎn),如果用PB創(chuàng)建一個(gè)具有實(shí)時(shí)性特點(diǎn)的內(nèi)核,一定不能選用XIP技術(shù)。
到后來基于Windows CE的產(chǎn)品開始采用FLASH、IDE等永久存儲(chǔ)設(shè)備時(shí),文件系統(tǒng)又加了個(gè)FAT。內(nèi)核文件和其它應(yīng)用程序也可以存放到永久存儲(chǔ)設(shè)備中,內(nèi)核由加載程序解壓并加載到RAM的對(duì)象存儲(chǔ)區(qū)域(object store),包含在內(nèi)核中的所有系統(tǒng)應(yīng)用程序文件和DLL文件都存放到這個(gè)區(qū)域。當(dāng)執(zhí)行一個(gè)應(yīng)用程序時(shí),內(nèi)核將這個(gè)應(yīng)用程序調(diào)用的系統(tǒng)DLL加載到Slot 1(0x0200 0000-0x03FF FFFF)。在Windows CE.NET中Slot 1專用于XIP DLL使用。
RAM文件系統(tǒng)專用于對(duì)象存儲(chǔ)。在以前的文章中曾經(jīng)講過,它和ROM文件系統(tǒng)是Windows CE默認(rèn)的文件系統(tǒng)。Windows CE啟動(dòng)后把RAM分為對(duì)象存儲(chǔ)區(qū)域(object store)和應(yīng)用程序內(nèi)存區(qū)域(program memory)。對(duì)象存儲(chǔ)區(qū)域采用RAM文件系統(tǒng)來保存文件,一般用于保存內(nèi)核解開的所有文件。應(yīng)用程序內(nèi)存區(qū)域留給所有應(yīng)用程序運(yùn)行時(shí)使用。在Windows CE下“控制面板”-“系統(tǒng)”-“內(nèi)存”中,可以調(diào)節(jié)這兩個(gè)存儲(chǔ)區(qū)域的比例,滑塊向左,則釋放對(duì)象存儲(chǔ)區(qū)域的一些內(nèi)存并將這些內(nèi)存劃到應(yīng)用程序內(nèi)存區(qū)域中。滑塊向右則相反。
2、內(nèi)存結(jié)構(gòu)
Windows CE.NET只能管理512MB的物理內(nèi)存和4GB大小的虛擬地址空間。不同的CPU內(nèi)存管理方法也不同。對(duì)于MIPS和SHX系列CPU來說,物理地址映射是由CPU完成的,CE內(nèi)核可以直接訪問512MB的物理內(nèi)存。對(duì)于x86系列和ARM系列的CPU來說,在內(nèi)核啟動(dòng)過程中它會(huì)將現(xiàn)有物理內(nèi)存地址全部映射到0x8000 0000以上的虛擬地址空間中供內(nèi)核以后使用。OEM可以通過OEMAddressTable來詳細(xì)定義虛擬地址和物理地址的映射關(guān)系。OEMAddressTable本身并不是一個(gè)文件,它只是存在于其它文件中描述虛擬地址和實(shí)際物理地址的映射關(guān)系的數(shù)據(jù)。比如文件oem init.asm中包含一段代碼:dd 80000000h, 0, 04000000h 。它表示將整個(gè)物理地址(0x0400 0000=64MB)共64MB映射到虛擬地址從0x8000 0000到0x8400 0000中。關(guān)于OEMAddressTable我將在以后關(guān)于PB的文章中講述。
整個(gè)4GB虛擬地址空間主要?jiǎng)澐譃閮刹糠郑瑥?x8000 0000以上為內(nèi)核使用部分,0x8000 0000以下為應(yīng)用程序使用部分。詳細(xì)見下表:
地址范圍用途
0x0000 0000到0x41FF FFFF 由所有應(yīng)用程序使用。共33個(gè)槽,每個(gè)槽占32MB。槽0(Slot 0)由當(dāng)前占有CPU的進(jìn)程使用。槽1由XIP DLL使用。其它槽用于進(jìn)程使用,每個(gè)進(jìn)程占用一個(gè)槽。
0x4200 0000到0x7FFF FFFF 由所有應(yīng)用程序共享的區(qū)域。32MB地址空間有時(shí)不能夠滿足一些進(jìn)程的需求。那么進(jìn)程可以使用這個(gè)范圍的地址空間。在這個(gè)區(qū)域里應(yīng)用程序可以建堆、創(chuàng)建內(nèi)存映射文件、分配大的地址空間等。
0xA000 0000到0xBFFF FFFF 在這個(gè)范圍內(nèi)核重復(fù)定義0x8000 0000到0x9FFF FFFF之間定義的物理地址映射空間。區(qū)別是在這范圍映射的虛擬地址空間不能夠用于緩沖。
我舉例來說明:假設(shè)一個(gè)產(chǎn)品有64MB物理內(nèi)存。如上文所述定義好OEMAddressTable后。內(nèi)核啟動(dòng)后一個(gè)物理地址映射空間范圍在0x8000 0000到0x8400 0000,那么內(nèi)核會(huì)從0xA000 0000到0xA400 0000定義一個(gè)同樣范圍的地址空間,這個(gè)地址空間和0x8000 0000到0x8400 0000映射到相同的物理地址。但這個(gè)虛擬地址空間不能夠用于緩沖。
0xC000 0000到0xC1FF FFFF系統(tǒng)保留空間
0xC200 0000到0xC3FF FFFF內(nèi)核程序nk.exe使用的地址空間。
0xC400 0000到0xDFFF FFFF 這個(gè)范圍為用戶定義的靜態(tài)虛擬地址空間,但這個(gè)地址空間只能用于非緩沖使用。
利用OEMAddressTable定義物理地址映射空間后,每次內(nèi)核啟動(dòng)時(shí)這個(gè)范圍都不改變了,除非產(chǎn)品包含的物理內(nèi)存容量發(fā)生變化。假如增加到128MB物理內(nèi)存,那么物理地址映射空間也向后擴(kuò)大了一倍。Windows CE.NET也允許用戶創(chuàng)建靜態(tài)的物理地址映射空間。用戶可以調(diào)用CreateStaticMapping函數(shù)或者NKCreateStaticMapping函數(shù)來映射某一段物理地址到0xC400 0000和0xE000 0000之間的某一個(gè)范圍。需要注意的是用這個(gè)函數(shù)創(chuàng)建的靜態(tài)虛擬地址只能夠由內(nèi)核訪問,而且不能用于緩沖。
0xE000 0000到0xFFFF FFFF 內(nèi)核使用的虛擬地址。當(dāng)內(nèi)核需要大的虛擬地址空間時(shí),會(huì)在這個(gè)范圍內(nèi)分配。

圖1 Windows CE.NET內(nèi)存結(jié)構(gòu)
3、進(jìn)程地址空間結(jié)構(gòu)
進(jìn)程地址空間結(jié)構(gòu)如圖2所示。這個(gè)圖源至MSDN。Windows CE.NET同以前版本的Windows CE操作系統(tǒng)在進(jìn)程地址空間上有所不同,以前的Windows CE把XIP DLL也加載到進(jìn)程的32MB地址空間中,而Windows CE.NET把XIP DLL單獨(dú)加載到Slot 1中,這樣對(duì)于每個(gè)進(jìn)程來說,它總的地址空間就大了一倍,也就是64MB。這個(gè)問題我在講解進(jìn)程的時(shí)候提到過。
當(dāng)一個(gè)應(yīng)用程序啟動(dòng)時(shí),內(nèi)核為這個(gè)程序選擇一個(gè)空閑的槽(Slot),并且加載所有的代碼、資源,并分配堆棧,加載DLL等。當(dāng)這個(gè)進(jìn)程得到CPU使用權(quán)時(shí),它的整個(gè)地址空間被內(nèi)核映射到Slot 0,也就是當(dāng)前進(jìn)程使用的地址空間,然后開始運(yùn)行。圖中給出的地址實(shí)際上是經(jīng)過映射到Slot 0之后的結(jié)構(gòu)。從圖中可以看出,進(jìn)程首先加載代碼段,因?yàn)槊總€(gè)進(jìn)程最低部64KB作為保留區(qū)域,所以代碼段從0x0001 0000開始,內(nèi)核為代碼段分配足夠的虛擬地址空間后,接著分配空間為只讀數(shù)據(jù)和可讀/可寫數(shù)據(jù),接著分配空間為資源數(shù)據(jù),之后分配空間為默認(rèn)堆和棧。非XIP DLL從進(jìn)程最高地址向下開始加載。非XIP DLL的加載按如下規(guī)則:內(nèi)核先檢查要加載的DLL是否被其它進(jìn)程加載過,如果加載過,就做一個(gè)地址的重定位。這樣就避免了整個(gè)系統(tǒng)內(nèi)多次加載相同DLL。如果沒有加載過,就按照從槽的高地址到槽的低地址的順序查找空閑的地址空間。然后分配足夠的地址空間用于加載DLL。因?yàn)槊總€(gè)進(jìn)程在執(zhí)行前都要映射到Slot 0,而且進(jìn)程使用的所有DLL可能來自不同的槽(Slot),為避免所有使用的DLL在映射到Slot 0中出現(xiàn)地址空間沖突的現(xiàn)象,內(nèi)核的加載器(Loader)在加載DLL時(shí)會(huì)查找所有槽中加載的DLL的地址,保證在映射到Slot 0時(shí)不會(huì)發(fā)生地址沖突現(xiàn)象。假如系統(tǒng)內(nèi)有兩個(gè)進(jìn)程,進(jìn)程A只加載了DLL A,進(jìn)程B需要加載DLL A和DLL B,那么進(jìn)程B會(huì)留出DLL A的地址空間,然后加載DLL B,也就是說進(jìn)程B映射到Slot 0時(shí),DLL A的地址空間和DLL B的地址空間是相鄰的,不會(huì)發(fā)生沖突。好在Windows CE下DLL都很小,而且一個(gè)應(yīng)用程序使用的DLL多數(shù)是系統(tǒng)的DLL(存在于Slot 1)。所以目前來看進(jìn)程的地址空間還夠用。
同其它Windows操作系統(tǒng)一樣,Windows CE.NET也支持32位虛擬內(nèi)存機(jī)制、按需分配內(nèi)存和內(nèi)存映射文件等。但是與其它Windows操作系統(tǒng)又有明顯的不同。畢竟Windows CE是一種嵌入式實(shí)時(shí)性的操作系統(tǒng),在內(nèi)存管理方面必須要比其它Windows操作系統(tǒng)更節(jié)約物理內(nèi)存和虛擬地址空間。在內(nèi)存管理API方面,為了便于移植程序,Windows CE和其它Windows操作系統(tǒng)函數(shù)聲明基本一致,這使一個(gè)在其它Windows下開發(fā)的程序員可以直接使用早就熟悉的API函數(shù), 但是CE下內(nèi)存管理的原理開發(fā)者還是應(yīng)該熟悉的。
1、ROM和RAM
最早的基于Windows CE的民用產(chǎn)品,采用的存儲(chǔ)設(shè)備都是ROM + RAM ,ROM保存CE內(nèi)核文件、應(yīng)用程序,而RAM用于內(nèi)核、所有應(yīng)用程序運(yùn)行時(shí)使用,關(guān)閉電源時(shí)必須給RAM提供電力來保存系統(tǒng)配置信息、用戶產(chǎn)生的文件等。為了適應(yīng)這樣的存儲(chǔ)硬件,CE采用了ROM文件系統(tǒng)和RAM文件系統(tǒng)。在ROM中存放的模塊可以是壓縮的,也可以是不壓縮的,這取決于OEM。OEM在定制內(nèi)核時(shí)可以設(shè)置是否壓縮模塊。如果是壓縮的,模塊在運(yùn)行前先解壓并全部存放到RAM中。如果是不壓縮的,就本地執(zhí)行(XIP,executed in place)。本地執(zhí)行和其它Windows操作系統(tǒng)下執(zhí)行應(yīng)用程序、DLL方式一致,也就是應(yīng)用了內(nèi)存映射文件技術(shù)。在這里我順便講一下。在啟動(dòng)時(shí)應(yīng)用程序或DLL的代碼段不加載到物理內(nèi)存中,內(nèi)核只是分配虛擬地址空間給代碼段,當(dāng)執(zhí)行代碼時(shí)內(nèi)核會(huì)到實(shí)際存放在硬盤上的文件中尋找代碼并執(zhí)行。采用這樣的技術(shù)既可以節(jié)省可用內(nèi)存又可以減少加載的時(shí)間。請(qǐng)注意,操作系統(tǒng)首先會(huì)到為硬盤準(zhǔn)備的緩沖區(qū)里讀取代碼數(shù)據(jù),如果沒有就命令硬盤讀取應(yīng)用程序文件數(shù)據(jù)到緩沖區(qū)。所以緩沖區(qū)設(shè)置大點(diǎn)是有好處的。Windows CE的本地執(zhí)行就是采用這樣的技術(shù)來加載ROM內(nèi)的應(yīng)用程序和DLL的。所以Windows CE的DLL分為XIP DLL和非XIP DLL。這種加載方式的缺點(diǎn)就是執(zhí)行相對(duì)較慢一點(diǎn),如果用PB創(chuàng)建一個(gè)具有實(shí)時(shí)性特點(diǎn)的內(nèi)核,一定不能選用XIP技術(shù)。
到后來基于Windows CE的產(chǎn)品開始采用FLASH、IDE等永久存儲(chǔ)設(shè)備時(shí),文件系統(tǒng)又加了個(gè)FAT。內(nèi)核文件和其它應(yīng)用程序也可以存放到永久存儲(chǔ)設(shè)備中,內(nèi)核由加載程序解壓并加載到RAM的對(duì)象存儲(chǔ)區(qū)域(object store),包含在內(nèi)核中的所有系統(tǒng)應(yīng)用程序文件和DLL文件都存放到這個(gè)區(qū)域。當(dāng)執(zhí)行一個(gè)應(yīng)用程序時(shí),內(nèi)核將這個(gè)應(yīng)用程序調(diào)用的系統(tǒng)DLL加載到Slot 1(0x0200 0000-0x03FF FFFF)。在Windows CE.NET中Slot 1專用于XIP DLL使用。
RAM文件系統(tǒng)專用于對(duì)象存儲(chǔ)。在以前的文章中曾經(jīng)講過,它和ROM文件系統(tǒng)是Windows CE默認(rèn)的文件系統(tǒng)。Windows CE啟動(dòng)后把RAM分為對(duì)象存儲(chǔ)區(qū)域(object store)和應(yīng)用程序內(nèi)存區(qū)域(program memory)。對(duì)象存儲(chǔ)區(qū)域采用RAM文件系統(tǒng)來保存文件,一般用于保存內(nèi)核解開的所有文件。應(yīng)用程序內(nèi)存區(qū)域留給所有應(yīng)用程序運(yùn)行時(shí)使用。在Windows CE下“控制面板”-“系統(tǒng)”-“內(nèi)存”中,可以調(diào)節(jié)這兩個(gè)存儲(chǔ)區(qū)域的比例,滑塊向左,則釋放對(duì)象存儲(chǔ)區(qū)域的一些內(nèi)存并將這些內(nèi)存劃到應(yīng)用程序內(nèi)存區(qū)域中。滑塊向右則相反。
2、內(nèi)存結(jié)構(gòu)
Windows CE.NET只能管理512MB的物理內(nèi)存和4GB大小的虛擬地址空間。不同的CPU內(nèi)存管理方法也不同。對(duì)于MIPS和SHX系列CPU來說,物理地址映射是由CPU完成的,CE內(nèi)核可以直接訪問512MB的物理內(nèi)存。對(duì)于x86系列和ARM系列的CPU來說,在內(nèi)核啟動(dòng)過程中它會(huì)將現(xiàn)有物理內(nèi)存地址全部映射到0x8000 0000以上的虛擬地址空間中供內(nèi)核以后使用。OEM可以通過OEMAddressTable來詳細(xì)定義虛擬地址和物理地址的映射關(guān)系。OEMAddressTable本身并不是一個(gè)文件,它只是存在于其它文件中描述虛擬地址和實(shí)際物理地址的映射關(guān)系的數(shù)據(jù)。比如文件oem init.asm中包含一段代碼:dd 80000000h, 0, 04000000h 。它表示將整個(gè)物理地址(0x0400 0000=64MB)共64MB映射到虛擬地址從0x8000 0000到0x8400 0000中。關(guān)于OEMAddressTable我將在以后關(guān)于PB的文章中講述。
整個(gè)4GB虛擬地址空間主要?jiǎng)澐譃閮刹糠郑瑥?x8000 0000以上為內(nèi)核使用部分,0x8000 0000以下為應(yīng)用程序使用部分。詳細(xì)見下表:
地址范圍用途
0x0000 0000到0x41FF FFFF 由所有應(yīng)用程序使用。共33個(gè)槽,每個(gè)槽占32MB。槽0(Slot 0)由當(dāng)前占有CPU的進(jìn)程使用。槽1由XIP DLL使用。其它槽用于進(jìn)程使用,每個(gè)進(jìn)程占用一個(gè)槽。
0x4200 0000到0x7FFF FFFF 由所有應(yīng)用程序共享的區(qū)域。32MB地址空間有時(shí)不能夠滿足一些進(jìn)程的需求。那么進(jìn)程可以使用這個(gè)范圍的地址空間。在這個(gè)區(qū)域里應(yīng)用程序可以建堆、創(chuàng)建內(nèi)存映射文件、分配大的地址空間等。
0xA000 0000到0xBFFF FFFF 在這個(gè)范圍內(nèi)核重復(fù)定義0x8000 0000到0x9FFF FFFF之間定義的物理地址映射空間。區(qū)別是在這范圍映射的虛擬地址空間不能夠用于緩沖。
我舉例來說明:假設(shè)一個(gè)產(chǎn)品有64MB物理內(nèi)存。如上文所述定義好OEMAddressTable后。內(nèi)核啟動(dòng)后一個(gè)物理地址映射空間范圍在0x8000 0000到0x8400 0000,那么內(nèi)核會(huì)從0xA000 0000到0xA400 0000定義一個(gè)同樣范圍的地址空間,這個(gè)地址空間和0x8000 0000到0x8400 0000映射到相同的物理地址。但這個(gè)虛擬地址空間不能夠用于緩沖。
0xC000 0000到0xC1FF FFFF系統(tǒng)保留空間
0xC200 0000到0xC3FF FFFF內(nèi)核程序nk.exe使用的地址空間。
0xC400 0000到0xDFFF FFFF 這個(gè)范圍為用戶定義的靜態(tài)虛擬地址空間,但這個(gè)地址空間只能用于非緩沖使用。
利用OEMAddressTable定義物理地址映射空間后,每次內(nèi)核啟動(dòng)時(shí)這個(gè)范圍都不改變了,除非產(chǎn)品包含的物理內(nèi)存容量發(fā)生變化。假如增加到128MB物理內(nèi)存,那么物理地址映射空間也向后擴(kuò)大了一倍。Windows CE.NET也允許用戶創(chuàng)建靜態(tài)的物理地址映射空間。用戶可以調(diào)用CreateStaticMapping函數(shù)或者NKCreateStaticMapping函數(shù)來映射某一段物理地址到0xC400 0000和0xE000 0000之間的某一個(gè)范圍。需要注意的是用這個(gè)函數(shù)創(chuàng)建的靜態(tài)虛擬地址只能夠由內(nèi)核訪問,而且不能用于緩沖。
0xE000 0000到0xFFFF FFFF 內(nèi)核使用的虛擬地址。當(dāng)內(nèi)核需要大的虛擬地址空間時(shí),會(huì)在這個(gè)范圍內(nèi)分配。

圖1 Windows CE.NET內(nèi)存結(jié)構(gòu)
3、進(jìn)程地址空間結(jié)構(gòu)
進(jìn)程地址空間結(jié)構(gòu)如圖2所示。這個(gè)圖源至MSDN。Windows CE.NET同以前版本的Windows CE操作系統(tǒng)在進(jìn)程地址空間上有所不同,以前的Windows CE把XIP DLL也加載到進(jìn)程的32MB地址空間中,而Windows CE.NET把XIP DLL單獨(dú)加載到Slot 1中,這樣對(duì)于每個(gè)進(jìn)程來說,它總的地址空間就大了一倍,也就是64MB。這個(gè)問題我在講解進(jìn)程的時(shí)候提到過。
當(dāng)一個(gè)應(yīng)用程序啟動(dòng)時(shí),內(nèi)核為這個(gè)程序選擇一個(gè)空閑的槽(Slot),并且加載所有的代碼、資源,并分配堆棧,加載DLL等。當(dāng)這個(gè)進(jìn)程得到CPU使用權(quán)時(shí),它的整個(gè)地址空間被內(nèi)核映射到Slot 0,也就是當(dāng)前進(jìn)程使用的地址空間,然后開始運(yùn)行。圖中給出的地址實(shí)際上是經(jīng)過映射到Slot 0之后的結(jié)構(gòu)。從圖中可以看出,進(jìn)程首先加載代碼段,因?yàn)槊總€(gè)進(jìn)程最低部64KB作為保留區(qū)域,所以代碼段從0x0001 0000開始,內(nèi)核為代碼段分配足夠的虛擬地址空間后,接著分配空間為只讀數(shù)據(jù)和可讀/可寫數(shù)據(jù),接著分配空間為資源數(shù)據(jù),之后分配空間為默認(rèn)堆和棧。非XIP DLL從進(jìn)程最高地址向下開始加載。非XIP DLL的加載按如下規(guī)則:內(nèi)核先檢查要加載的DLL是否被其它進(jìn)程加載過,如果加載過,就做一個(gè)地址的重定位。這樣就避免了整個(gè)系統(tǒng)內(nèi)多次加載相同DLL。如果沒有加載過,就按照從槽的高地址到槽的低地址的順序查找空閑的地址空間。然后分配足夠的地址空間用于加載DLL。因?yàn)槊總€(gè)進(jìn)程在執(zhí)行前都要映射到Slot 0,而且進(jìn)程使用的所有DLL可能來自不同的槽(Slot),為避免所有使用的DLL在映射到Slot 0中出現(xiàn)地址空間沖突的現(xiàn)象,內(nèi)核的加載器(Loader)在加載DLL時(shí)會(huì)查找所有槽中加載的DLL的地址,保證在映射到Slot 0時(shí)不會(huì)發(fā)生地址沖突現(xiàn)象。假如系統(tǒng)內(nèi)有兩個(gè)進(jìn)程,進(jìn)程A只加載了DLL A,進(jìn)程B需要加載DLL A和DLL B,那么進(jìn)程B會(huì)留出DLL A的地址空間,然后加載DLL B,也就是說進(jìn)程B映射到Slot 0時(shí),DLL A的地址空間和DLL B的地址空間是相鄰的,不會(huì)發(fā)生沖突。好在Windows CE下DLL都很小,而且一個(gè)應(yīng)用程序使用的DLL多數(shù)是系統(tǒng)的DLL(存在于Slot 1)。所以目前來看進(jìn)程的地址空間還夠用。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- C語言多線程的詳細(xì)教程資料說明 10次下載
- 關(guān)于進(jìn)程與線程的解析PDF文件資料
- windows應(yīng)用程序讀取進(jìn)程的內(nèi)存工具免費(fèi)下載 1次下載
- Windows CE 進(jìn)程、線程和內(nèi)存管理一 0次下載
- Windows CE 進(jìn)程、線程和內(nèi)存管理二 0次下載
- Windows CE 電源管理解析 0次下載
- 基于Windows 操作系統(tǒng)內(nèi)核驅(qū)動(dòng)的多核CPU 線程管理 0次下載
- 用多線程實(shí)現(xiàn)GPS接收機(jī)與PDA在Windows CE下的串口通 5次下載
- 基于Windows CE MSCEComm控件的串行通信 4次下載
- Windows CE詳解 67次下載
- 基于Windows CE的GPS串行通信的實(shí)現(xiàn)
- 基于Windows CE的數(shù)控軟件開發(fā)與實(shí)現(xiàn)
- Windows線程、窗口與消息內(nèi)在機(jī)制研究
- Windows CE下多線程串口通信
- WINDOWS核心編程 (pdf下載)
- Python中多線程和多進(jìn)程的區(qū)別 447次閱讀
- 線程是什么的基本單位 進(jìn)程與線程的本質(zhì)區(qū)別 980次閱讀
- 進(jìn)程和線程的概念及其區(qū)別 944次閱讀
- RTOS中的線程、進(jìn)程和協(xié)程詳解 2032次閱讀
- 關(guān)于Python多進(jìn)程和多線程詳解 872次閱讀
- Java多線程的用法 973次閱讀
- 程序中進(jìn)程和線程的區(qū)別 696次閱讀
- 進(jìn)程(線程)精細(xì)化控制中方法的使用 616次閱讀
- 什么是多線程 1304次閱讀
- 為什么在JVM中線程崩潰不會(huì)導(dǎo)致JVM進(jìn)程崩潰呢? 697次閱讀
- 基于Windows NT多線程實(shí)現(xiàn)智能蓄電池遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計(jì) 1860次閱讀
- 如何管理Linux 的內(nèi)存分頁? 3818次閱讀
- 如何避免僵尸進(jìn)程,多線程的實(shí)現(xiàn)原理 8350次閱讀
- Windows CE.NET 4.2下的串行通信技術(shù)講解 1706次閱讀
- 一文讀懂線程、進(jìn)程、程序之間的不同 1356次閱讀
下載排行
本周
- 1EN60335-1安規(guī)標(biāo)準(zhǔn) 中文版本
- 1.86 MB | 53次下載 | 1 積分
- 2LT7406FJ N溝道增強(qiáng)型功率MOSFET規(guī)格書
- 1.38 MB | 2次下載 | 免費(fèi)
- 3米爾-瑞芯微RK3562核心板開發(fā)板,4核CPU,ARM中量級(jí)多面手
- 3.45 MB | 2次下載 | 免費(fèi)
- 4運(yùn)算放大電路入門教程
- 0.70 MB | 1次下載 | 免費(fèi)
- 5開源鴻蒙版真4K顯示器廣告機(jī)主板AIoT-6780SE彩頁
- 613.79 KB | 1次下載 | 免費(fèi)
- 6LTS6806SR N溝道增強(qiáng)型功率MOSFET規(guī)格書
- 0.99 MB | 次下載 | 免費(fèi)
- 7LT3810FP-X N溝道增強(qiáng)型功率MOSFET規(guī)格書
- 0.92 MB | 次下載 | 免費(fèi)
- 8LTS4008TRB N溝道增強(qiáng)型功率MOSFET規(guī)格書
- 1.58 MB | 次下載 | 免費(fèi)
本月
- 1STM32CubeMX用于STM32配置和初始化C代碼生成
- 21.90 MB | 619次下載 | 免費(fèi)
- 2STM32開發(fā)板教程之STM32開發(fā)指南免費(fèi)下載
- 24.88 MB | 176次下載 | 3 積分
- 3DeepSeek:從入門到精通
- 5.36 MB | 95次下載 | 1 積分
- 4EN60335-1安規(guī)標(biāo)準(zhǔn) 中文版本
- 1.86 MB | 53次下載 | 1 積分
- 5OAH0428最新規(guī)格書(中文)
- 2.52 MB | 27次下載 | 10 積分
- 6UHV系列雷電沖擊電壓發(fā)生器試驗(yàn)裝置詳細(xì)說明使用
- 1.07 MB | 17次下載 | 免費(fèi)
- 7Altium-常用3D封裝庫(Step)接插件篇
- 4.95 MB | 14次下載 | 免費(fèi)
- 8介紹一些常用的電子元器件
- 3.20 MB | 8次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935124次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233088次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191371次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183336次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81583次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評(píng)論