怎樣設置S3c2440A平臺HIVE注冊表 binfs
出處:互聯(lián)網(wǎng) 發(fā)布于:2011-09-04 13:42:10
其實所有的工作都是改注冊表,但是怎么改,為什么這么改要搞懂就蠻費一番心思了,好在俺是喜歡鉆研這個東西接下來就讓我給你們介紹下S3c2440A 平臺HIVE注冊表binfs 的實現(xiàn)。
我們的案子是基于samsung S3C2440A+samsung ONENAND+WinCE5.0的,開發(fā)平臺是platform builder 5.0,首先我們基于RAM regiSTer的image已經(jīng)可以正常跑起來了,F(xiàn)lash 除了放置image 外其他的空間為用戶提供文件系統(tǒng),這部分的驅(qū)動程序是用三星的PocetStoreII15。
先來回味一下底層的東東,我們的Image主要由兩部分組成:XIPKERNEL.bin和NK.bin,XIPKERNEL.bin中的東西就是那些WinCE中比較的又需要經(jīng)常加載的一些程序和DLL文件,這些文件會被Boot Loader在剛啟動的時候拷貝到RAM中去,這樣就可以在RAM中XIP(Excute in place)了。在NK.bin中的基本上是需要但不至于要常駐內(nèi)存的一些程序和DLL了,比如我們BuildIn下的大部分驅(qū)動,比如微軟的IE,mediaplayer等應用程序,甚至連設備管理器device.exe也可以放到這里面,這些文件只有在需要的時候才被復制到內(nèi)存中去執(zhí)行,節(jié)約了內(nèi)存并且也加快了啟動的時間。嘿,到這里大概知道binfs 的工作原理和重要性吧。
binfs的建立工作是在用UT(OEM自己的一種底層的工具集)實現(xiàn)的,UT在燒image的時候會自動把XIPKERNEL和NK分別保存到flash的特定的邏輯扇區(qū)上。啟動的時候Boot Loader會先把XIPKERNEL復制到RAM中,然后跳到RAM中的XIPKERNEL的入口點去執(zhí)行,這個時候會跑一些OEMinit之類的CPU,內(nèi)存,中短等初始化的過程,接著OS會從注冊表中找到binfs的一些設置,然后加載binfs的驅(qū)動使binfs分區(qū)對OS來講是可用的,假如device.exe是在NK.bin中的話,那么在這個時候就可以用\binfs\device.exe(\binfs是假設的裝載路徑)來調(diào)用它了,如果這個時候binfs沒有初始化成功那么,device.exe得不到執(zhí)行,那么系統(tǒng)肯定就起不來了。
現(xiàn)在來講講HIVE,其實HIVE是個很簡單的東西,都怪和binfs牽到一起搞得很多問題都走錯了方向,本來一天就能搞定結(jié)果搞了四五天,NND。這么說吧,WinCE下面就兩種注冊表,一種是RAM based,另外就是HIVE based了,缺省用的是前者,如果用前者PB會在編譯的時候把common.reg和platform.reg的內(nèi)容做到一個叫reginit.ini的文件然后壓縮成default.***(忘記擴展名了,有過老跡象了哈)的文件放到XIPKERNEL中去,image在起來的時候會把這個文件解壓到RAM中形成RAM based注冊表,既然是RAM based那么所有的改動都會在斷電后蒸發(fā),哈哈。怎么辦呢?其實再笨你也能想出來,保存到磁盤上不就結(jié)了嗎!?對你太聰明了,但是你想如果你把注冊表全放到磁盤(SDMMC或HDD或Flash)上WinCE怎么在沒有加載你磁盤的驅(qū)動的情況下讀到注冊表呢?而一般情況加載磁盤的驅(qū)動程序也是要注冊表的支持?。『?,對了,這就是HIVE想到的,看它怎么做,它把注冊表分成兩部分(其實是三部分,當時大體還是兩步分,把user.hv和system.hv做一部分),部分就是叫做boot.hv的注冊表,里面的東西就是一些在沒有拿到保存在磁盤的注冊表之前引導時需要的一些設置,這部分的注冊表和RAM based的是一樣的,改了之后斷電就沒了,所以這部分的注冊表項都是不需要改動的,需要改動的都放到第二部分就是了,這第二部分就是system.hv和user.hv了,也就是一直提到的要放到磁盤上的注冊表。 編譯的時候PB會根據(jù)platform.reg和Common.reg中的標簽判斷哪些表項放到boot.hv中,這個標簽就是;HIVE BOOT SECTION ;END BOOT SECTION,夾在這個標簽之間的表項PB在編譯的時候會把它們?nèi)絙oot.hv中去(boot.hv是二進制文件,要看里面到底放了哪些表項用一個老外寫的工具吧,好像叫d_readvol.exe,到google上找得到的),其他的內(nèi)容會分別塞到default.hv和user.hv中去,會把這三個hv文件統(tǒng)統(tǒng)塞到XIPKERNEL中去,這樣WinCE在引導的階段就把所有的hv扔到RAM中去了,然后打開boot.hv拿到必要的資料,這其中包括如何加載放置system.hv的磁盤的驅(qū)動,所以那些和加載這個磁盤相關的驅(qū)動要統(tǒng)統(tǒng)放到boot.hv中,比如FAT文件系統(tǒng)驅(qū)動,mspart分區(qū)驅(qū)動等等,這里有一點很重要就是假如你用binfs而且device.exe在NK.bin中,那么一定在階段要保證binfs可用,否則這里就不可能為system.hv創(chuàng)造條件了。WinCE次啟動時候磁盤上沒有東東,這個時候WinCE會將內(nèi)存中的default.hv和user.hv復制到注冊表BootVars指定的地方,default.hv往往會被重命名為system.hv,第二次啟動會先檢查磁盤上的hv是不是和內(nèi)存中的一致,不一致就加載磁盤上的表項。
整個過程就是這樣子,但要注意一點,HIVE注冊表也是在內(nèi)存中運行的,不同的是啟動的時候會從磁盤上去讀改動的表項,因為這樣才能保證速度,所以你做的的注冊表改動也是在內(nèi)存中做的,這個時候如果你不掉用FlushRegister去將內(nèi)存中的數(shù)值保存到磁盤上那么這些改動還是會丟失的。兩種方法來避免丟失,一種是認為去調(diào)用FlushRegister,令一種就設置一個flag讓WinCE在每次改動注冊表后自動Flush.
總結(jié)一下我到底做了哪些事情:
1)在PB中將HIVEbased Registers拉到項目的WorkSpaces中來。
2)把Platform.reg中的下列表項加到boot.hv中
3)Build Image了
我也是參考了這個才得以實現(xiàn),注冊表配置為:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE\init\BootVars]
"SYSTEMHIVE"="system.hv"
"Start DevMgr"=dword:1
"DefaultUser"="default"
"Flags"=dword:3
"RegistryFlags"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDrv]
; "DriverPath"="Drivers\\BlockDevice\\FlashDrv"
; "LoadFlags"=dword:1
; "MountFlags"=dword:11
; "BootPhase"=dword:0
; "Flags"=dword:1000
"DriverPath"="Drivers\\BlockDevice\\FlashDrv"
"LoadFlags"=dword:1
"MountFlags"=dword:11
"BootPhase"=dword:1
"Flags"=dword:1000 ;lieal modify
[HKEY_LOCAL_MACHINE\Drivers\BlockDevice\FlashDrv]
"Prefix"="DSK"
"Dll"="FLASHDRV.dll"
"Order"=dword:0
"Ioctl"=dword:4
"Profile"="FlashDrv"
"FriendlyName"="MS Flash Driver"
"MountFlags"=dword:11
"BootPhase"=dword:0
"Flags"=dword:1000 ;lieal modify
; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv]
DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
;"MountFlags"=dword:2 ;11 to 2 lieal modify
"Folder"="ResidentFlash"
"Name"="Microsoft Flash Disk"
"BootPhase"=dword:0
"Flags"=dword:1000 ;lieal modify
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv\FATFS]
"FriendlyName"="FAT FileSystem"
"Dll"="fatfsd.dll"
"Flags"=dword:00280014
"Paging"=dword:1
"CacheSize"=dword:0
"EnableCacheWarm"=dword:0
"EnableCache"=dword:1
"MountFlags"=dword:2
; END HIVE BOOT SECTION
但是具體的 關于這些詳細參數(shù)的說明,卻沒有找到合適的出處,如果有誰知道,還忘指點!
版權與免責聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關法律責任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權等法律責任。
如涉及作品內(nèi)容、版權等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關權利。
- ARM技術架構與應用開發(fā)實踐指南2026/1/6 10:40:19
- 嵌入式實時操作系統(tǒng)(RTOS)選型與移植技術指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術選型與抗干擾設計實踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎知識2025/7/14 16:59:04









