WinCE下申請大容量物理記憶體

2021-03-31 08:57:01 字數 1577 閱讀 2021

付林林天極網

申請大容量的物理記憶體看起來不是難事。這裡的大容量是指幾十mb甚至更多的物理記憶體。對於c++程式設計師來說可能平時習慣了使用「new」操作符來實現。我也是這樣。使用「new」非常簡單,申請之後只需判斷返回的指標是否是空即可。在其它的windows作業系統上的確不需要在申請大容量物理記憶體上過多考慮。但是在windows ce上就不同了。如果只用「new」就能搞定,那就太省事了。

不知道windows ce下軟體開發者是否遇到過這種情況,如果使用「new」申請超過30mb的物理記憶體,那麼返回的一定是空(null),甚至程式會死鎖無法響應。這其實不奇怪。在《windows ce下程序、執行緒和記憶體管理》的系列文章中我早有所言,windows ce下每個程序占有32mb的位址空間,雖然slot 1槽存放所有的非xip dll,但是我們不可能占用slot 1槽。32mb位址空間減去必要的**段、靜態資料段、預設堆和預設棧之後,所剩的位址空間少於32mb。即使程式什麼都不做也無法滿足超過30mb的位址空間的申請需求。所以返回為空非常正常。好在windows ce下執行的大多數軟體不需要那麼多的物理記憶體。

感覺微軟的技術不是支援到很遠的將來,而是得過且過,只要滿足目前的和不遠的將來的需求就行。拿platform builder來說,imgram64環境變數用於支援64mb物理記憶體。可是沒有imgram128或者imgram256甚至imgram512。可能是當時絕大多數基於windows ce的產品都沒有超過64mb物理記憶體。現在要支援超過64mb物理記憶體就必須做一些修改操作。再如現在說的用「new」分配物理記憶體,也只是限制在32mb以內。如果想new多少就new多少,那多爽!

「new」不行是因為位址空間不夠,那我們可以採用虛擬記憶體分配,然後提交物理記憶體這種辦法。理論上是這樣,但是實際上還是不行。舉例如下:

lpvoid g_address1, g_address2;

g_address1 = virtualalloc(0, 32 * 1024 * 1024, mem_reserve, page_noaccess);

g_address2 = virtualalloc(g_address1, 32 * 1024 * 1024, mem_***mit, page_readwrite);

上面這段**中第乙個語句是申請32mb的虛擬位址空間,函式返回乙個位址說明申請是成功的。注意這個位址一定處於0x4200 0000以上(具體參見我的專欄中《windows ce下程序、執行緒和記憶體管理(三)

》)。第二個語句是提交物理記憶體,容量為32mb。這個函式返回null,說明申請物理記憶體不成功。如果申請10mb、20mb的還可以。

希望再一次破滅。最後的辦法就是記憶體對映檔案了。在windows ce的幫助文件中只提到了記憶體對映檔案可以用來申請虛擬位址空間。可以試一試。結果證明用記憶體對映檔案來申請大容量物理記憶體是可行的。記憶體對映檔案用於多個程序共享資料時,建立記憶體對映的函式的第乙個引數必須設定為invalid_handle_value,表示在物理記憶體中建立。利用這個特點我們可以申請超過32mb的物理記憶體。具體能夠申請的大小由剩餘的物理記憶體決定。例子如下:

上述的函式如果都成功了,你就可以使用物理記憶體了。虛擬記憶體的首位址是lpaddress。使用完了別忘了呼叫函式unmapviewoffile(lpaddress); 和closehandle(hfile);

WinCE下如何獲取SD卡容量

參考下面 void getstorageinfo cstring tmp tmp.format l di bytes per sect d di total sectors d total captal d r n inbuf.di bytes per sect,inbuf.di total sec...

如何使wince5 0支援大容量flash

且聽風吟 21 16 35 我以前的bsp是4.2的,sd沒有原始碼,現在經理畫錯電路圖 且聽風吟 21 16 39 改不了中 斷且聽風吟 21 16 52 想弄個wince5.0來搞 陳偉 21 17 12 那就弄啊,怎麼改不了中斷 且聽風吟 21 18 20 4.2沒有原始碼改不了,現在用5.0...

Linux下訪問記憶體實體地址

linux核心裡提供的 dev mem驅動,為我們讀寫記憶體實體地址,提供了乙個渠道。下面講述2種利用mem裝置檔案進行實體地址讀寫的方法,一種是裝置驅動的方法,另一種是系統呼叫的方法。首先我們看下mem這個裝置檔案,dev mem是linux下的乙個字元裝置,原始檔是 drivers char m...