WINCE6.0支持Multiple XIP
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
時間:2012.02.29
類別:WINCE系統開發
********************************LoongEmbedded********************************
?
1.??? Multiple XIP support
XIP(eXecute-In-Place)是本地執行,允許在ROM芯片內執行XIP區域(region)的應用代碼,而不必再把代碼讀取到RAM中來執行。WINCE支持我們在單個系統中構建(construct)多個XIP區域,基于下面的理由使用多個XIP區域來代替單個區域:
⑴可以把應用(application)分成實用的子集(functional subsets),并且支持從OS內核中分開安裝。
⑵增加新特征(feature)時,不需要替換整個運行時鏡像(run-time image)。
⑶當解決掉一個bug后的更新不需要替換整個運行時鏡像。
⑷用戶可以更新運行時鏡像。
⑸更新運行時鏡像是永久性(permanent)的,在冷啟動時不容易受影響。
閃存(flash memory)作為掩膜只讀存儲器(masked ROM)的替代品日益廣泛使用,是一種支持多個XIP區域的芯片技術。在這個討論多個XIP區域的幫助主題中,和ROM相關的閃存用于保存系統鏡像(system image)。
多個XIP區域把ROM鏡像分成分離的和地址逐漸遞增的單元,在此借用下圖來說明,
?
圖1
那如何劃分XIP鏡像呢?要考慮區域中模塊(module)和文件(files)的所有者,并且要考慮這些模塊和文件的功能,基于這樣的思想來劃分。
需要注意的是XIP不能跨過不連續的物理區域,盡管虛擬地址連續,當跨越不同物理區域的代碼在本地執行時,一些設備沒有響應(unresponsive)。沒有壓縮并且跨越不連續物理區域的文件和模塊在沒有經過復制的情況下被直接映射或是訪問,但是內核(kernel)只處理物理連續的文件。
2.??? Multiple XIP Regions
因為我們可以在單個系統中構造多個XIP區域,從這點上,在使用多個存儲區(memory area,比如設計中同時使用ROM、flash等多個存儲器)的應用場合,我們可以使用XIP的功能。比如,我們可以安裝OS的內核部分在ROM中,和把OS的其他部分安裝在閃存(flash memory)中。XIP應用能夠在兩個地方執行,我們可以根據需要逐漸以地址遞增的方式規劃閃存區域(flash region),但是存儲器中的XIP區域必須使只讀的,比如圖1中的XIPKERNEL.NBO在NAND Flash中必須使只讀的。
?????? 我們可以根據自己的需要把多個ROM區域鏈接(chain)起來,在通過usb下載XIP鏡像的時候,就是通過下載chain.lst,接著eboot根據此lst文件自動下載XIPKERNEL.bin、NK.bin和chain.bin文件,然后啟動WINCE操作系統的。我們每次增加一個ROM區域時,內核可以替代另一個ROM區域,這里內核不是物理上替換這個模塊,而是用一個不同的ROM區域中的模塊來代替它的功能性(Each time you add a ROM region, the kernel may replace another ROM region. The kernel does not physically replace the module, but replaces its functionality with a new module in a separate ROM region)。我們定義ROM區域的順序決定了OS在上面寫入模塊的次序。包含NK.exe的ROM區域位于管理多個ROM區域的目錄清單底部,見圖1,我們的nk.exe就是包含在XIPKERNEL.bin中的。內核增加新的特征在目錄清單頂部,也就是圖1的NK.nb0部分,這樣可以讓我們通過連接其他的ROM區域來替換除了nk.exe之外的原始鏡像的模塊。
?
為了增加一個ROM區域(可以理解為xxx.bin)到一個已經存在的運行時鏡像中,創建一個列新的.bib文件,此文件列舉我們要增加到或是替換一個已經存在的OS設計中的模塊。如果要增加一個新的.exe文件或者替換一個已經存在的一個,只需要增加一個.exe文件到.bib文件中。
?
如果我們增加或是修個一個DLL,那必須在.bib文件中制定一個增加的入口。在WINCE中,所有的DLL文件從虛擬內存進程空間自上到下加載(all DLLs load from the top down in the virtual memory process space)。因為WINCE在相同的的地址位置為一個指定的.exe文件裝載所有DLL文件,.bin文件的MODULES部分為所有DLL文件預留相同大小的虛擬內存空間。對于任何指定的進程,系統不是裝載同樣的DLL文件到進程地址空間中,就是為后來的裝載預留空間(For any specified process, the system either loads the same DLLs to the process address space or reserves space to load later)。當使用Makeimg.exe來編譯一個ROM鏡像(比如nk.bin)時,它會生成鏡像中DLL的開始地址和最后的地址,如下:
First DLL Address:?? 01f90000h
Last DLL Address:??? 02000000h
?
?????? 我們必須在新.bib文件的CONFIG部分包含一個入口,使用DLLHIGHADDR來指定關聯的ROM鏡像的DLL地址空間的起始地址。此起始地址是原來(original).bin文件中為DLL分配的虛擬內存空間的最低地址。在新的.bin文件中,Makeimg.exe從系統可以開始預留和裝載的虛擬內存中列出開始地址,系統從起始地址開始預留存儲空間(The system reserves memory from the starting address down),下面的示例代碼解釋了一個新的.bin文件生成一個示例DLL的開始地址:
DLLHIGHADDR=0x01f90000
?
我們要確保XIP區域不能重疊,如果重疊會導致系統不能正常啟動。為了避免引起系統問題,需要在DLL區域之間留下一定的內存空間,但這樣會減少一個進程中可用虛擬內存的大小。因為內核為所有ROM預留同樣大小的虛擬內存空間來裝載DLL,內核從不使用DLL之間的內存空間。在不需要重新安排緊接著其后的ROM鏡像的情況下,使用這個內存空間來擴大ROM鏡像的DLL空間。
?
內核許可一個DLL從一個鏡像完全剝離出來,即使這個DLL與其他的模塊隱式關聯。Romimage.exe打印一個缺少DLL的警告,但仍然創建這個鏡像文件。這樣使我們可以從RAM文件系統或是目標控制框架(target control shell)中裝載這個找不到的DLL。
?
3.??? Booting an image with Multiple XIP Regions
如要引導(boot)一個multiple XIP的鏡像,bootloader必須裝載數據到flash存儲器或者RAM中,接著OEMInit函數必須處理XIP鏈(chain)中的每個入口,增加每個入口到OEMRomChain結構體中,此結構體的定義如下圖所示:
?
圖2
OEM在config.bib中能夠制定所有XIP的ROMChain次序,比如圖1所示,依次是xipkernel、chain和nk。如果遍歷(traverse)OEMRomChain結構體的鏈表且在內核(在此為xipkernel.bin)存儲的位置上又找不到內核,那么內核自動附加ROM到OEMRomChain鏈表中。
4.??? Building an image with Multiple XIP Regions
創建一個由多個XIP區域組成的鏡像,是由config.bib和IMGMULTIBIN(但實際上是IMGMULTIXIP)環境變量來控制,此變量必須設置為1,如在smdk6410.bat中設置如下:
set IMGMULTIXIP=1
多個XIP成功編譯將生成下面的文件:
⑴為每個XIP區域生成一個對應的.bin文件,比如xipkernel.bin、chain.bin和nk.bin。
⑵一個單獨的xip.bin文件,此文件包含所有的xip區域文件,比如xip.bin=xipkernel.bin+chain.bin+nk.bin。
⑶一個XIP鏈的bin文件,為chain.bin文件。
⑷如果config.bib文件中設置了ROMSTART,ROMWIDTH或是ROMSIZE,那么會生成xip.nb0文件。Xip.nb0文件時所有的.bin文件的布局,如圖1所示,包含chain.bin,因為它們(xipkernel.bin、chain.bin和nk.bin)應保存在ROM中。
?
?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的WINCE6.0支持Multiple XIP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WINCE---内核(kernel)--
- 下一篇: WINCE应用BINFS