日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Platform Builder實踐之兩個要點

          Platform Builder實踐之兩個要點

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

            對大容量物理內(nèi)存的支持

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

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

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

          dd 80000000h, 0, 04000000h

          dd 0, 0, 0

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

          cd %_WINCEROOT%PublicCommonOakCspi486Oal

            然后鍵入下列命令:

          build -c

          sysgen i486oal

            build命令根據(jù)配置文件內(nèi)容編譯整個目錄,sysgen批處理將build 編譯的文件i486oal.lib文件復制到CE的安裝目錄和內(nèi)核工程目錄下。我安裝的BSP是基于x86的,所以相應目錄為%_WINCEROOT%PUBLICCOMMONOAKLIBX86RETAIL和%_PROJECTROOT%cesysgenoaklibx86 etail兩個目錄。上一步做完之后,接著開始修改config.bib文件。在以前的文章中講過在config.bib文件中定義內(nèi)存區(qū)域。在config.bib中預設的配置沒有超過64MB的,所以要自己手工添加??筛鶕?jù)原有的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層通過變量或者函數(shù)更改物理內(nèi)存的大小,適合設備可能出現(xiàn)增加或減小內(nèi)存的情況。CE的幫助文檔介紹了幾種方法,這里只提一下CreateStaticMapping函數(shù)。CreateStaticMapping函數(shù)作為config.bib文件的補充,適合在用戶模式的應用程序或驅動程序中調(diào)用,調(diào)用這個函數(shù)能夠將指定首地址的物理內(nèi)存塊映射到虛擬地址空間,函數(shù)返回虛擬地址。虛擬地址范圍在C400 0000 到 E000 0000之間,這是內(nèi)核的地址空間,只能由內(nèi)核訪問。相比較VirtualCopy函數(shù)用于動態(tài)地將指定首地址的物理內(nèi)存塊映射到虛擬地址空間,這個虛擬地址空間一般為用戶進程的地址空間,因為VirtualCopy函數(shù)被設計專用于驅動程序調(diào)用,它常被用于將一個物理內(nèi)存塊映射到不同的虛擬地址空間。

            實現(xiàn)永久保存注冊表數(shù)據(jù)

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

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

            1、nk.exe執(zhí)行,啟動filesys.exe。

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

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

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

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

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

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

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

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

            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的值為系統(tǒng)HIVE文件的路徑。Start DevMgr是一個布爾值,指示是否開始就執(zhí)行設備管理器device.exe,按照CE幫助文檔的說法,只有想把系統(tǒng)HIVE存儲在對象存儲中才在此設置為0,所以一般都要設置為1。

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

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

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

          Flags=dword:1000

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

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

          [HKEY_LOCAL_MACHINESystemStorageManagerProfilesHDProfile]

          MountFlags=dword:2

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

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

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

          [HKEY_LOCAL_MACHINEinitBootVars]
          RegistryFlags=dword:1

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

          [HKEY_LOCAL_MACHINE]
          RegPersisted=dword:1




          關鍵詞: PlatformBuilder MMU

          評論


          相關推薦

          技術專區(qū)

          關閉