?? 24402memory.txt
字號:
目前我們的實驗板可用RAM空間是64M,在WINCE系統中對應的虛擬地址從0x8c000000-0x8ff00000,我們來仔細分析一下這些寶貴的RAM資源是如何使用的。
首先,系統啟動時會自動將映象NK.nb0拷貝到RAM中再運行,目前我們分配給NK.nb0的空間是29M(0x8c200000-0x8cdf0000)。無形當中就有29M不能使用,但是如果在定制系統的時候根據需求,以“開發出滿足最大的開發需要的最小的系統內核”為標準,還是可以充分利用有限的RAM資源的。
其次,有一部分RAM可以由用戶自己定義為某個外設的緩存區,比如:display、dbug、camera等等,這部分空間雖然可以修改,但是個人認為這部分空間沒必要做修改。主要原因有二:一方面是這部分空間一般都是約定俗成的(比較了一個不同版本的BSP后得出來的),修改后有可能影響系統的穩定性;另一方面這部分空間是從0x8c000000-0x8c200000,大概就是2M空間,修改后可能可以省出1M空間。所以考慮到系統的穩定性,和節省的空間并不是很大,對這部分就不做修改。
配置系統內存和程序內存
在config.bib文件的config區有這樣一個參數。
FSRAMPERCENT:
格式:FSRAMPERCENT = number
默認值為0x80808080。指定為文件系統分配的內存的百分比。number分為四個字節,由十六進制表示。
byte0的值(單位為4KB)表示在第一個2MB中,其中每1MB包含的4KB的整數倍。
byte1的值(單位為4KB)表示在第二個2MB中,其中每1MB包含的4KB的整數倍。
byte2的值(單位為4KB)表示在第三個2MB中,其中每1MB包含的4KB的整數倍。
byte3的值(單位為4KB)表示在剩下的內存中,每1MB包含的4KB的整數倍。
計算一下默認值0x80808080表示的百分比:0x80*4K/1M = 0.5,因為每個字節都等于0.5,所以整個占用的百分比是50%。
默認情況下,系統內存和文件內存是各占50%的,所以程序內存就只有17M了。為了提高系統的性能可以通過修改FSRAMPERCENT值的大小,來獲得較大的程序內存空間。
又一篇
我的是2440的板子的BSP,里邊的原文件我拿過來分析的,其中有幾個地方不懂,請大家指教:
boot.bib文件
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
DRV_GLB 8c020000 00001000 RESERVED
BIN_FS 8c021000 00005000 RESERVED
RAM 8c026000 00006000 RAM
STACK 8c02c000 00004000 RESERVED
EBOOT 8c038000 00020000 RAMIMAGE
; EBOOT 8c038000 00040000 RAMIMAGE
; 16 MB area used to cache nk.bin while programming boot media.
; TBD: we may need to adjust to 01400000 (20 MB) to cache PPC 2003.
FLSCACHE 8D000000 01000000 RESERVED
config.bib文件:
;#define CHAIN_ADDRESS 81E40000
; CHAIN $(CHAIN_ADDRESS) 00001000 RESERVED
; pdwXIPLoc 00000000 $(CHAIN_ADDRESS) FIXUPVAR
;;; Tarzan Debug mode
NK 8C200000 02400000 RAMIMAGE
RAM 8E600000 01900000 RAM
; Common RAM areas
AUD_DMA 8c002000 00002000 RESERVED
DRV_GLB 8c010000 00010000 RESERVED
SD_DMA 8c028000 00008000 RESERVED
EDBG 8c030000 00020000 RESERVED
DISPLAY 8c1d0000 00030000 RESERVED
現在不明白的地方有:
(1)boot.bib中和config.bib定義的內存段有重復的地方,比如說EBOOT 8c038000 00020000 RAMIMAGE 和
EDBG 8c030000 00020000 RESERVED 這樣是否有影響,我看到有文章說,EBOOT鏡像在的地方不可以被重寫和覆蓋,但是,這里卻重復了???
(2)按理說,congfig.bib中的定義和頭文件中定義的地址一致才對,以下是我從loarder.h中截出來的,請看
// Nk Memory reigions defined in config.bib...
//
#define ROM_RAMIMAGE_START 0x8C100000
#define ROM_RAMIMAGE_SIZE 0x01000000
// Start addresses must match config.bib's RAMIMAGE
#define RAM_START 0x8d100000
#define RAM_SIZE 0x00F00000
按照config.bib的定義,以上應該是以下才對
// Nk Memory reigions defined in config.bib...
//
#define ROM_RAMIMAGE_START 8C200000
#define ROM_RAMIMAGE_SIZE 02400000
// Start addresses must match config.bib's RAMIMAGE
#define RAM_START 8E600000
#define RAM_SIZE 01900000
這個是我的理解錯誤,還是什么的,請各位大俠指教,我的是wince5.0
又一篇
實現永久保存注冊表數據
關于注冊表在前面的文章中已經介紹過了,這里只講述如何實現永久保存注冊表數據。
注冊表類型分為基于對象存儲的注冊表和基于HIVE的注冊表,在定制內核的時候只能選擇其中一種。從理論上講這兩種注冊表都能夠實現永久保存注冊表數據,但是采用不同的類型會影響CE的啟動順序和啟動速度,還會影響內存的使用量。我還是趨向于采用基于HIVE的注冊表來實現永久保存注冊表數據,這也是一個發展趨勢。在講解之前先簡單描述如果CE采用基于HIVE的注冊表,那么在啟動時如何加載已經保存的注冊表數據:
1、nk.exe執行,啟動filesys.exe。
2、filesys.exe加載引導HIVE,此時引導HIVE位于nk.bin解壓之后的文件中。
3、filesys.exe啟動device.exe,之后處于等待狀態,等待device.exe將包含系統HIVE的文件系統和存儲設備的驅動程序加載完畢。而這個文件系統和存儲設備的驅動程序存在于引導HIVE中。
4、device.exe加載上述所說的文件系統驅動程序和存儲設備驅動程序,使之開始工作。之后device.exe處于等待狀態。
5、filesys.exe被喚醒,加載并且安裝系統HIVE。之后filesys.exe處于等待狀態。
6、nk.exe按照系統HIVE的信息開始執行初始化工作。其中包括加載驅動程序和啟動一些應用程序。其中加載驅動程序一般由device.exe執行,而啟動應用程序由filesys.exe執行。這時device.exe和filesys.exe已經被喚醒。
因為引導HIVE和系統HIVE肯定有重復的地方,所以可能出現重復加載了驅動程序或者重復啟動了應用程序。為此,CE允許在描述驅動程序的注冊表信息中加入防止重復的標志,而應用程序可以采用事件對象來防止重復啟動,如device.exe。
下面講述如何設置基于HIVE的注冊表(假如保存系統HIVE的是FAT文件系統):
1、在PB中加入"Hive-based Registry",如果是Geode平臺,再加入BSP_ENABLE_FSREGHIVE環境變量。
2、打開platform.reg,找到如下信息:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="Documents and Settings\\system.hv"
"PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:0
IF BSP_ENABLE_FSREGHIVE
"Start DevMgr"=dword:1
ENDIF
; END HIVE BOOT SECTION
"SYSTEMHIVE"的值為系統HIVE文件的路徑。"Start DevMgr"是一個布爾值,指示是否開始就執行設備管理器device.exe,按照CE幫助文檔的說法,只有想把系統HIVE存儲在對象存儲中才在此設置為0,所以一般都要設置為1。
3、如果是多用戶,可以在上述的注冊表位置下輸入"DefaultUser"="<username>",指定默認的用戶名。如果是單用戶系統,可以不設置。
4、保證將包含系統HIVE的文件系統驅動程序的注冊表信息和存儲設備的驅動程序的注冊表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間,在這兩個語句之間的注冊表數據全部屬于引導HIVE。假如我們將系統HIVE文件system.hv存放在硬盤上,并采用FAT文件系統。那么就要將[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]和[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]移動到“; HIVE BOOT SECTION”下。
5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間的所有驅動程序的注冊表信息中都加入下列一個標志:
"Flags"=dword:1000
這個標志是一個位掩碼,它可以和其它已經存在的"Flags"或運算。值1000表示此驅動程序只加載一次,這樣device.exe就不會把當前驅動程序加載兩次了。
6、在包含系統HIVE的存儲設備的驅動程序的注冊表信息中,加入如下標志(假設是硬盤):
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\HDProfile]
"MountFlags"=dword:2
這個標志表示這個存儲設備包含系統HIVE文件。
按照如上所述設置后的內核就能實現永久存儲注冊表數據了。對于保存注冊表數據的執行動作在此必須闡述清楚:
正常情況下,CE能夠保證重要的注冊表數據能夠從內存刷到(Flush)永久存儲器上。但是這并不能完全保證所有數據都能完整地保存而不丟失,所以要保證萬無一失,應該主動地調用RegFlushKey函數強制將內存中的數據刷到永久存儲器上。這個函數的參數只有一個,就是注冊表分支。CE還增加一個注冊表項(如下所示),它的作用是每當函數RegCloseKey被調用時都自動調用RegFlushKey函數。
[HKEY_LOCAL_MACHINE\init\BootVars]
"RegistryFlags"=dword:1
如果CE在啟動過程中發現系統HIVE出現錯誤,它會自動刪除文件并創建一個默認的系統HIVE文件,如果出現下面的注冊表項,說明發生了這種事情。
[HKEY_LOCAL_MACHINE]
"RegPersisted"=dword:1
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -