<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Platform Builder實(shí)踐之兩個(gè)要點(diǎn)

Platform Builder實(shí)踐之兩個(gè)要點(diǎn)

作者: 時(shí)間:2007-05-11 來(lái)源:網(wǎng)絡(luò ) 收藏
增加對大容量物理內存的支持和永久存儲注冊表是在定制內核工作中常遇到的問(wèn)題。本篇文章將對這兩個(gè)方面闡述相關(guān)的知識并指導讀者如何在PB中實(shí)現。

  對大容量物理內存的支持

  在PC上增加物理內存是很方便的,插上內存條后只要自檢程序識別,那么桌面操作系統就能夠支持。而在基于CE的產(chǎn)品上就沒(méi)那么簡(jiǎn)單了。如果物理內存大于64MB,就要在定制內核時(shí)做一些工作。

  一旦內存管理單元()開(kāi)始工作,CPU就不再直接訪(fǎng)問(wèn)物理內存了,對于運行在x86和ARM系列CPU上的CE內核來(lái)說(shuō),必須先確立物理內存地址同虛擬內存地址的映射關(guān)系。這種關(guān)系實(shí)際是在一個(gè)名為OEMAddressTable的表中定義的。這個(gè)表在前面的文章中已經(jīng)提到過(guò)。CE提供了兩種虛擬地址映射方法,分別為靜態(tài)映射和動(dòng)態(tài)映射,這個(gè)表屬于靜態(tài)映射方法。靜態(tài)映射的虛擬地址空間只能由內核訪(fǎng)問(wèn),而動(dòng)態(tài)映射的地址空間可以由用戶(hù)模式的應用程序訪(fǎng)問(wèn)。OEMAddressTable在文件%_WINCEROOT%PublicCommonOakCspi486OalOEMInit.asm中。在這個(gè)文件的最后有一段代碼:

; RAM 0x80000000 -> 0x00000000, size 64M

dd 80000000h, 0, 04000000h

dd 0, 0, 0

  這段代碼表示將虛擬地址80000000映射到物理地址0,大小為64MB。將04000000h改成實(shí)際的物理內存大小,然后保存。接著(zhù)單擊PB菜單“Build”-“Open Build Release Directory”,在命令行中先用cd命令進(jìn)入上述目錄,如:

cd %_WINCEROOT%PublicCommonOakCspi486Oal

  然后鍵入下列命令:

build -c

sysgen i486oal

  build命令根據配置文件內容編譯整個(gè)目錄,sysgen批處理將build 編譯的文件i486oal.lib文件復制到CE的安裝目錄和內核工程目錄下。我安裝的BSP是基于x86的,所以相應目錄為%_WINCEROOT%PUBLICCOMMONOAKLIBX86RETAIL和%_PROJECTROOT%cesysgenoaklibx86 etail兩個(gè)目錄。上一步做完之后,接著(zhù)開(kāi)始修改config.bib文件。在以前的文章中講過(guò)在config.bib文件中定義內存區域。在config.bib中預設的配置沒(méi)有超過(guò)64MB的,所以要自己手工添加??筛鶕械腎MGRAM64配置更改,原有的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

  在這里沒(méi)有更改NK的大小,只是修改了RAM的大小。

  在config.bib定義之后,還可以在OAL層通過(guò)變量或者函數更改物理內存的大小,適合設備可能出現增加或減小內存的情況。CE的幫助文檔介紹了幾種方法,這里只提一下CreateStaticMapping函數。CreateStaticMapping函數作為config.bib文件的補充,適合在用戶(hù)模式的應用程序或驅動(dòng)程序中調用,調用這個(gè)函數能夠將指定首地址的物理內存塊映射到虛擬地址空間,函數返回虛擬地址。虛擬地址范圍在C400 0000 到 E000 0000之間,這是內核的地址空間,只能由內核訪(fǎng)問(wèn)。相比較VirtualCopy函數用于動(dòng)態(tài)地將指定首地址的物理內存塊映射到虛擬地址空間,這個(gè)虛擬地址空間一般為用戶(hù)進(jìn)程的地址空間,因為VirtualCopy函數被設計專(zhuān)用于驅動(dòng)程序調用,它常被用于將一個(gè)物理內存塊映射到不同的虛擬地址空間。

  實(shí)現永久保存注冊表數據

  關(guān)于注冊表在前面的文章中已經(jīng)介紹過(guò)了,這里只講述如何實(shí)現永久保存注冊表數據。

  注冊表類(lèi)型分為基于對象存儲的注冊表和基于HIVE的注冊表,在定制內核的時(shí)候只能選擇其中一種。從理論上講這兩種注冊表都能夠實(shí)現永久保存注冊表數據,但是采用不同的類(lèi)型會(huì )影響CE的啟動(dòng)順序和啟動(dòng)速度,還會(huì )影響內存的使用量。我還是趨向于采用基于HIVE的注冊表來(lái)實(shí)現永久保存注冊表數據,這也是一個(gè)發(fā)展趨勢。在講解之前先簡(jiǎn)單描述如果CE采用基于HIVE的注冊表,那么在啟動(dòng)時(shí)如何加載已經(jīng)保存的注冊表數據:

  1、nk.exe執行,啟動(dòng)filesys.exe。

  2、filesys.exe加載引導HIVE,此時(shí)引導HIVE位于nk.bin解壓之后的文件中。

  3、filesys.exe啟動(dòng)device.exe,之后處于等待狀態(tài),等待device.exe將包含系統HIVE的文件系統和存儲設備的驅動(dòng)程序加載完畢。而這個(gè)文件系統和存儲設備的驅動(dòng)程序存在于引導HIVE中。

  4、device.exe加載上述所說(shuō)的文件系統驅動(dòng)程序和存儲設備驅動(dòng)程序,使之開(kāi)始工作。之后device.exe處于等待狀態(tài)。

  5、filesys.exe被喚醒,加載并且安裝系統HIVE。之后filesys.exe處于等待狀態(tài)。

  6、nk.exe按照系統HIVE的信息開(kāi)始執行初始化工作。其中包括加載驅動(dòng)程序和啟動(dòng)一些應用程序。其中加載驅動(dòng)程序一般由device.exe執行,而啟動(dòng)應用程序由filesys.exe執行。這時(shí)device.exe和filesys.exe已經(jīng)被喚醒。

  因為引導HIVE和系統HIVE肯定有重復的地方,所以可能出現重復加載了驅動(dòng)程序或者重復啟動(dòng)了應用程序。為此,CE允許在描述驅動(dòng)程序的注冊表信息中加入防止重復的標志,而應用程序可以采用事件對象來(lái)防止重復啟動(dòng),如device.exe。

  下面講述如何設置基于HIVE的注冊表(假如保存系統HIVE的是FAT文件系統):

  1、在PB中加入Hive-based Registry,如果是Geode平臺,再加入BSP_ENABLE_FSREGHIVE環(huán)境變量。

  2、打開(kāi)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是一個(gè)布爾值,指示是否開(kāi)始就執行設備管理器device.exe,按照CE幫助文檔的說(shuō)法,只有想把系統HIVE存儲在對象存儲中才在此設置為0,所以一般都要設置為1。

  3、如果是多用戶(hù),可以在上述的注冊表位置下輸入DefaultUser=username>,指定默認的用戶(hù)名。如果是單用戶(hù)系統,可以不設置。

  4、保證將包含系統HIVE的文件系統驅動(dòng)程序的注冊表信息和存儲設備的驅動(dòng)程序的注冊表信息被包含在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間,在這兩個(gè)語(yǔ)句之間的注冊表數據全部屬于引導HIVE。假如我們將系統HIVE文件system.hv存放在硬盤(pán)上,并采用FAT文件系統。那么就要將[HKEY_LOCAL_MACHINESystemStorageManagerFATFS]和[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]移動(dòng)到“; HIVE BOOT SECTION”下。

  5、在“; HIVE BOOT SECTION”和“; END HIVE BOOT SECTION”之間的所有驅動(dòng)程序的注冊表信息中都加入下列一個(gè)標志:

Flags=dword:1000

  這個(gè)標志是一個(gè)位掩碼,它可以和其它已經(jīng)存在的Flags或運算。值1000表示此驅動(dòng)程序只加載一次,這樣device.exe就不會(huì )把當前驅動(dòng)程序加載兩次了。

  6、在包含系統HIVE的存儲設備的驅動(dòng)程序的注冊表信息中,加入如下標志(假設是硬盤(pán)):

[HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]

MountFlags=dword:2

  這個(gè)標志表示這個(gè)存儲設備包含系統HIVE文件。

  按照如上所述設置后的內核就能實(shí)現永久存儲注冊表數據了。對于保存注冊表數據的執行動(dòng)作在此必須闡述清楚:

  正常情況下,CE能夠保證重要的注冊表數據能夠從內存刷到(Flush)永久存儲器上。但是這并不能完全保證所有數據都能完整地保存而不丟失,所以要保證萬(wàn)無(wú)一失,應該主動(dòng)地調用RegFlushKey函數強制將內存中的數據刷到永久存儲器上。這個(gè)函數的參數只有一個(gè),就是注冊表分支。CE還增加一個(gè)注冊表項(如下所示),它的作用是每當函數RegCloseKey被調用時(shí)都自動(dòng)調用RegFlushKey函數。

[HKEY_LOCAL_MACHINEinitBootVars]
RegistryFlags=dword:1

  如果CE在啟動(dòng)過(guò)程中發(fā)現系統HIVE出現錯誤,它會(huì )自動(dòng)刪除文件并創(chuàng )建一個(gè)默認的系統HIVE文件,如果出現下面的注冊表項,說(shuō)明發(fā)生了這種事情。

[HKEY_LOCAL_MACHINE]
RegPersisted=dword:1




關(guān)鍵詞: PlatformBuilder MMU

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>