資料介紹
增加對大容量物理內存的支持和永久存儲注冊表是在定制內核工作中常遇到的問題。本篇文章將對這兩個方面闡述相關的知識并指導讀者如何在PB中實現。
對大容量物理內存的支持
在PC上增加物理內存是很方便的,插上內存條后只要自檢程序識別,那么桌面操作系統就能夠支持。而在基于CE的產品上就沒那么簡單了。如果物理內存大于64MB,就要在定制內核時做一些工作。
一旦內存管理單元(MMU)開始工作,CPU就不再直接訪問物理內存了,對于運行在x86和ARM系列CPU上的CE內核來說,必須先確立物理內存地址同虛擬內存地址的映射關系。這種關系實際是在一個名為OEMAddressTable的表中定義的。這個表在前面的文章中已經提到過。CE提供了兩種虛擬地址映射方法,分別為靜態映射和動態映射,這個表屬于靜態映射方法。靜態映射的虛擬地址空間只能由內核訪問,而動態映射的地址空間可以由用戶模式的應用程序訪問。OEMAddressTable在文件%_WINCEROOT%PublicCommonOakCspi486OalOEMInit.asm中。在這個文件的最后有一段代碼:
; RAM 0x80000000 -》 0x00000000, size 64M
dd 80000000h, 0, 04000000h
dd 0, 0, 0
這段代碼表示將虛擬地址80000000映射到物理地址0,大小為64MB。將04000000h改成實際的物理內存大小,然后保存。接著單擊PB菜單“Build”-“Open Build Release Directory”,在命令行中先用cd命令進入上述目錄,如:
cd %_WINCEROOT%PublicCommonOakCspi486Oal
然后鍵入下列命令:
build -c
sysgen i486oal
build命令根據配置文件內容編譯整個目錄,sysgen批處理將build 編譯的文件i486oal.lib文件復制到CE的安裝目錄和內核工程目錄下。我安裝的BSP是基于x86的,所以相應目錄為%_WINCEROOT%PUBLICCOMMONOAKLIBX86RETAIL和%_PROJECTROOT%cesysgenoaklibx86 etail兩個目錄。上一步做完之后,接著開始修改config.bib文件。在以前的文章中講過在config.bib文件中定義內存區域。在config.bib中預設的配置沒有超過64MB的,所以要自己手工添加。可根據原有的IMGRAM64配置更改,原有的IMGRAM64如下:
; 64 MB of RAM (note: AUTOSIZE will adjust boundary)
IF IMGRAM64
NK 80220000 009E0000 RAMIMAGE
RAM 80C00000 03000000 RAM
UMABUF 83C00000 00400000 RESERVED
ENDIF
假如要支持128MB,更改如下:
IF IMGRAM16 !
IF IMGRAM32 !
IF IMGRAM64 !
NK 80220000 009E0000 RAMIMAGE
RAM 80C00000 07000000 RAM
UMABUF 87C00000 00400000 RESERVED
ENDIF
ENDIF
ENDIF
在這里沒有更改NK的大小,只是修改了RAM的大小。
在config.bib定義之后,還可以在OAL層通過變量或者函數更改物理內存的大小,適合設備可能出現增加或減小內存的情況。CE的幫助文檔介紹了幾種方法,這里只提一下CreateStaticMapping函數。CreateStaticMapping函數作為config.bib文件的補充,適合在用戶模式的應用程序或驅動程序中調用,調用這個函數能夠將指定首地址的物理內存塊映射到虛擬地址空間,函數返回虛擬地址。虛擬地址范圍在C400 0000 到 E000 0000之間,這是內核的地址空間,只能由內核訪問。相比較VirtualCopy函數用于動態地將指定首地址的物理內存塊映射到虛擬地址空間,這個虛擬地址空間一般為用戶進程的地址空間,因為VirtualCopy函數被設計專用于驅動程序調用,它常被用于將一個物理內存塊映射到不同的虛擬地址空間。
實現永久保存注冊表數據
關于注冊表在前面的文章中已經介紹過了,這里只講述如何實現永久保存注冊表數據。
注冊表類型分為基于對象存儲的注冊表和基于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_MACHINEinitBootVars]
“SYSTEMHIVE”=“Documents and Settingssystem.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_MACHINESystemStorageManagerFATFS]和[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]移動到“; HIVE BOOT SECTION”下。
5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間的所有驅動程序的注冊表信息中都加入下列一個標志:
“Flags”=dword:1000
這個標志是一個位掩碼,它可以和其它已經存在的“Flags”或運算。值1000表示此驅動程序只加載一次,這樣device.exe就不會把當前驅動程序加載兩次了。
6、在包含系統HIVE的存儲設備的驅動程序的注冊表信息中,加入如下標志(假設是硬盤):
[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]
“MountFlags”=dword:2
這個標志表示這個存儲設備包含系統HIVE文件。
按照如上所述設置后的內核就能實現永久存儲注冊表數據了。對于保存注冊表數據的執行動作在此必須闡述清楚:
正常情況下,CE能夠保證重要的注冊表數據能夠從內存刷到(Flush)永久存儲器上。但是這并不能完全保證所有數據都能完整地保存而不丟失,所以要保證萬無一失,應該主動地調用RegFlushKey函數強制將內存中的數據刷到永久存儲器上。這個函數的參數只有一個,就是注冊表分支。CE還增加一個注冊表項(如下所示),它的作用是每當函數RegCloseKey被調用時都自動調用RegFlushKey函數。
[HKEY_LOCAL_MACHINEinitBootVars]
“RegistryFlags”=dword:1
如果CE在啟動過程中發現系統HIVE出現錯誤,它會自動刪除文件并創建一個默認的系統HIVE文件,如果出現下面的注冊表項,說明發生了這種事情。
[HKEY_LOCAL_MACHINE]
“RegPersisted”=dword:1
?
對大容量物理內存的支持
在PC上增加物理內存是很方便的,插上內存條后只要自檢程序識別,那么桌面操作系統就能夠支持。而在基于CE的產品上就沒那么簡單了。如果物理內存大于64MB,就要在定制內核時做一些工作。
一旦內存管理單元(MMU)開始工作,CPU就不再直接訪問物理內存了,對于運行在x86和ARM系列CPU上的CE內核來說,必須先確立物理內存地址同虛擬內存地址的映射關系。這種關系實際是在一個名為OEMAddressTable的表中定義的。這個表在前面的文章中已經提到過。CE提供了兩種虛擬地址映射方法,分別為靜態映射和動態映射,這個表屬于靜態映射方法。靜態映射的虛擬地址空間只能由內核訪問,而動態映射的地址空間可以由用戶模式的應用程序訪問。OEMAddressTable在文件%_WINCEROOT%PublicCommonOakCspi486OalOEMInit.asm中。在這個文件的最后有一段代碼:
; RAM 0x80000000 -》 0x00000000, size 64M
dd 80000000h, 0, 04000000h
dd 0, 0, 0
這段代碼表示將虛擬地址80000000映射到物理地址0,大小為64MB。將04000000h改成實際的物理內存大小,然后保存。接著單擊PB菜單“Build”-“Open Build Release Directory”,在命令行中先用cd命令進入上述目錄,如:
cd %_WINCEROOT%PublicCommonOakCspi486Oal
然后鍵入下列命令:
build -c
sysgen i486oal
build命令根據配置文件內容編譯整個目錄,sysgen批處理將build 編譯的文件i486oal.lib文件復制到CE的安裝目錄和內核工程目錄下。我安裝的BSP是基于x86的,所以相應目錄為%_WINCEROOT%PUBLICCOMMONOAKLIBX86RETAIL和%_PROJECTROOT%cesysgenoaklibx86 etail兩個目錄。上一步做完之后,接著開始修改config.bib文件。在以前的文章中講過在config.bib文件中定義內存區域。在config.bib中預設的配置沒有超過64MB的,所以要自己手工添加。可根據原有的IMGRAM64配置更改,原有的IMGRAM64如下:
; 64 MB of RAM (note: AUTOSIZE will adjust boundary)
IF IMGRAM64
NK 80220000 009E0000 RAMIMAGE
RAM 80C00000 03000000 RAM
UMABUF 83C00000 00400000 RESERVED
ENDIF
假如要支持128MB,更改如下:
IF IMGRAM16 !
IF IMGRAM32 !
IF IMGRAM64 !
NK 80220000 009E0000 RAMIMAGE
RAM 80C00000 07000000 RAM
UMABUF 87C00000 00400000 RESERVED
ENDIF
ENDIF
ENDIF
在這里沒有更改NK的大小,只是修改了RAM的大小。
在config.bib定義之后,還可以在OAL層通過變量或者函數更改物理內存的大小,適合設備可能出現增加或減小內存的情況。CE的幫助文檔介紹了幾種方法,這里只提一下CreateStaticMapping函數。CreateStaticMapping函數作為config.bib文件的補充,適合在用戶模式的應用程序或驅動程序中調用,調用這個函數能夠將指定首地址的物理內存塊映射到虛擬地址空間,函數返回虛擬地址。虛擬地址范圍在C400 0000 到 E000 0000之間,這是內核的地址空間,只能由內核訪問。相比較VirtualCopy函數用于動態地將指定首地址的物理內存塊映射到虛擬地址空間,這個虛擬地址空間一般為用戶進程的地址空間,因為VirtualCopy函數被設計專用于驅動程序調用,它常被用于將一個物理內存塊映射到不同的虛擬地址空間。
實現永久保存注冊表數據
關于注冊表在前面的文章中已經介紹過了,這里只講述如何實現永久保存注冊表數據。
注冊表類型分為基于對象存儲的注冊表和基于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_MACHINEinitBootVars]
“SYSTEMHIVE”=“Documents and Settingssystem.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_MACHINESystemStorageManagerFATFS]和[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]移動到“; HIVE BOOT SECTION”下。
5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間的所有驅動程序的注冊表信息中都加入下列一個標志:
“Flags”=dword:1000
這個標志是一個位掩碼,它可以和其它已經存在的“Flags”或運算。值1000表示此驅動程序只加載一次,這樣device.exe就不會把當前驅動程序加載兩次了。
6、在包含系統HIVE的存儲設備的驅動程序的注冊表信息中,加入如下標志(假設是硬盤):
[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]
“MountFlags”=dword:2
這個標志表示這個存儲設備包含系統HIVE文件。
按照如上所述設置后的內核就能實現永久存儲注冊表數據了。對于保存注冊表數據的執行動作在此必須闡述清楚:
正常情況下,CE能夠保證重要的注冊表數據能夠從內存刷到(Flush)永久存儲器上。但是這并不能完全保證所有數據都能完整地保存而不丟失,所以要保證萬無一失,應該主動地調用RegFlushKey函數強制將內存中的數據刷到永久存儲器上。這個函數的參數只有一個,就是注冊表分支。CE還增加一個注冊表項(如下所示),它的作用是每當函數RegCloseKey被調用時都自動調用RegFlushKey函數。
[HKEY_LOCAL_MACHINEinitBootVars]
“RegistryFlags”=dword:1
如果CE在啟動過程中發現系統HIVE出現錯誤,它會自動刪除文件并創建一個默認的系統HIVE文件,如果出現下面的注冊表項,說明發生了這種事情。
[HKEY_LOCAL_MACHINE]
“RegPersisted”=dword:1
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 深入解析Linux下 Platform_device 及Platform_driver
- GitHub入門與實踐 0次下載
- 科技論文摘要編寫要點分析 0次下載
- 開關電源的PCB電磁兼容設計要點分析
- 555電路圖要點分析及經典實例 132次下載
- 電動汽車電池的六大要點問題 10次下載
- 開關電源的PCB電磁兼容設計要點分析 39次下載
- 高速電路設計實踐PDF電子教材免費下載 329次下載
- FPGA視頻教程之SOPC builder的詳細基礎知識說明 8次下載
- ArcGIS WebApp Builder安裝教程 0次下載
- Platform Builder集成開發環境研究 1次下載
- DSP Builder下載入口 116次下載
- DSP Builder設計深入 54次下載
- ARM嵌入式WINDOWS CE實踐教程
- 基于C++ Builder與LabWindows/CVI平臺
- 【GD32 MCU 入門教程】一、GD32 MCU 開發環境搭建(3)使用 Embedded Builder 開發 GD32 443次閱讀
- SiC驅動電源設計要點(變壓器部分) 1236次閱讀
- 選擇PLC系統的步驟和要點 574次閱讀
- 海思Hi3566V100 SDIO硬件設計要點 2175次閱讀
- 一文總結linux的platform驅動 783次閱讀
- 什么是eNSP?華為網絡仿真平臺eNSP的使用方法 1.3w次閱讀
- 字節跳動基于Iceberg的海量特征存儲實踐 849次閱讀
- Lombok同時使用@Data和@Builder的一個必須要避開的巨坑 1822次閱讀
- pytorch實現斷電繼續訓練時需要注意的要點 1287次閱讀
- USB硬件EMC設計要點分享 5565次閱讀
- 變頻器的故障分析和解決 實踐檢驗、理論知識及維修水平 4089次閱讀
- 高過載變壓器結構設計要點及思路詳解(農網配電) 3503次閱讀
- 在智能制造實踐過程中,數據就是燃料,分析就是引擎 3688次閱讀
- 基于微小液體流量計選型的5大要點分析 3652次閱讀
- SATA支持ATAPI的設計要點 1708次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多