MTK平臺中關于Scatter文件學習教程
MTK平臺中關于Scatter文件學習是本文要介紹的內容,主要是來了解MTK平臺中Scatter文件的應用,具體內容來看本文詳解。
分散加載(scatterloading)是ARM連接接器提供的一個機制,該機制可以把一個可執行映像文件(即Bin文件)分割放置到內存中不同的獨立段。
映像(Image)文件有兩個視圖:加載視圖(Loadview)和執行視圖(executionview)。在下載的時候Imageregions被放置在memorymap當中,而在執行Image前,或許你需要將一些regions放置在它們執行時的地址上,并建立起ZIregions。例如,你初始化的RW數據需要從它在下載時的在ROM中的地址處移動到執行時RAM的地址處。
在scatter文件中可以為每一個代碼或數據段在裝載和執行時指定不同的存儲區域地址,
Scatlertoading的存儲區塊可以分成二種類型:
裝載區:當系統啟動或加載時應用程序的存放區。
執行區:系統啟動后,應用程序進行執行和數據訪問的存儲器區域,系統在實時運行時可以有一個或多個執行區。
映像中所有的代碼和數據都有一個裝載地址和運行地址(二者可能相同也可能不同,視具體情況而定)。在系統啟動時,C函數庫中的__main初始化代碼會執行必要的復制及清零操作,使應用程序的相應代碼和數據段從裝載狀態轉入執行狀態。



為什么需要Scatter文件:
制定存儲器映射(memorymap)的方法基本上有二種,一是在link時使用命令行選項,并在程序執行前利用linkerpre-definesymbol使用匯編語言制定section的段初始化,二是使用scatterfile,即采用“分散加載機制”。以上二種方法依應用程序的復雜度而定,一針對簡單的情況,二針對復雜的情況。
手機屬于復雜的情況,必須使用scatterfile。
Scatter文件語法:
scatter文件是一個簡單的文本文件,包含一些簡單的語法(分號后面的內容是注釋):
My_Region0x00000x1000;區域名稱區起始地址區長度
- {
- thecontextofregion;區內容
- }
每個區由一個頭標題開始定義,頭中至少包含區的名字和起始地址,另外還有最大長度和其他一些屬性選項。區定義的內容包括在緊接的一對花括號內,依賴于具體的系統情況。
一個加載區必須至少含有一個執行段;實踐中通常有多個執行段。
一個執行區必須至少含有一個代碼或數據段;這些通常來自源文件或庫函數等的目標文件;通配符號*可以匹配指定屬性項中所有沒有在文件中定義的余下部分。
簡單分散加載樣例
圖8所示樣例中,只有一個加載區,包含了所有的代碼和數據,起始地址為0。這個加載區一共對應兩個執行段。一個包含所有的RO代碼和數據,執行地址與裝載地址相同;同時另一個起始地址為0x10000的執行段,包含所有的RW和ZI數據。這樣當系統開始啟動時,從第一個執行段開始運行(執行地址等于裝載地址),在執行過程中,有一段初始化代碼會把裝載區中的一部分代碼轉移到另外的執行段中。
下面是這個scatter描述文件,該文件描述了上述存儲器映射方式。
- LOAD_ROM0x4000
- {
- EXE_ROM0x00000x4000
- {
- *〈+RO〉;所有代碼、常量數據
- }
- RAM0x100000x8000
- {
- *〈+RW,+ZI〉;所有非常量數據
- }
- }
在分散文件中放置對象
在大多數應用中,并不是像前例那樣,簡單地把所有屬性都放在一起,用戶需要控制特定代碼和數據段的放置位置。這可以通過在scatter文件中對單個目標文件進行定義實現,而不是只簡單地依靠通配符。
為了覆蓋標準的連接器布局規則,我們可以使用+FIRST和+LAST分散加載指令。典型的例子是在執行段的開始處放置中斷向量表格:
- LOAD_ROM0x00000x4000
- {
- EXEC_ROM0x00000x4000
- {
- vectors.o〈Vect,+FIRST〉
- *〈+RO〉
- }
- ;moreexecregions...
- }
在這個scatter文件中,保證了vextors.o中的Vect域被放置于地址0x0000。
一個實際的Scatter.txt詳細分析
ROM0x000x800000;名字為ROM的區,起始地址是0x00,區的長度是0x800000。區的名字是唯一的;MTK平臺對第一個區的大小限制是8Mbytes
{
ROM0x00FIXED0x3D8000;名稱為ROM的執行段,該名稱在所有執行段中是唯一的。段的起始地址是0x00,長度固定為0x3D8000.
{
bootarm.obj(C$$code,+First);First指把代碼放到本段的起始地址處,C$$code的含義可能是一個塊的名字.
*.obj(LEADING_PART,+First);含義應該是:把后綴名為.obj的文件的LEADING_PART塊放到緊挨前面(即bootarm.obj的結尾處)的地方。
*.l(+RO);所有以.l為后綴的文件的可執行代碼、常量放置在這里。
*bmt.lib(+RO);所有以bmt.lib結尾的文件的可執行代碼、常量放置在這里。
- *adaptation.lib(+RO)
- *config.lib(+RO)
- *custom.lib(+RO)
- *drv.lib(+RO)
- *fdm.lib(+RO)
- *init.lib(+RO)
- *kal.lib(+RO)
- *l1_classb.lib(+RO)
- *nucleus.lib(+RO)
- *nucleus_int.lib(+RO)
- *nucleus_debug.lib(+RO)
- *stacklib.lib(+RO)
- *sst.lib(+RO)
- *tst.lib(+RO)
- *mtkapp.lib(+RO)
- *usb.lib(+RO)
- ;*j2me_hi.lib(+RO);這行語句被注釋了,無效
- *nvram.lib(+RO)
- *nvram_sec.lib(+RO)
- *ft.lib(+RO)
- *irda.lib(+RO)
- *fs.lib(+RO)
- *media.lib(+RO)
- *media_sec.lib(+RO)
- *dsp_ram.lib(+RO)
- ;*plutommi.lib(+RO)
- ScreenRotation.obj(+RO)
- wingui.obj(+RO)
- wgui_categories.obj(+RO)
- ;*media.lib(+RO)
- png_decoder_sw.obj(PRIMARY_CODE);png_decoder_sw.obj文件中的PRIMARY_CODE塊(可以是代碼、數據)放在這里。
- ;*mmiresource.lib(+RO)
- custNFBProgressImg.obj(+RO)
- gui_wrapper.obj(+RO)
- }
- DYNAMIC_CODE20xA0018800OVERLAY0x2800;對照MT6228芯片的地址空間表,DYNAMIC_CODE2塊將放在TCM中。
- {
- *(G3D_DYNAMIC_CODE,G3D_DYNAMIC_ZI);塊G3D_DYNAMIC_CODE、G3D_DYNAMIC_ZI包含的代碼、數據都放這。
- }
- DYNAMIC_CODE10xA001B000OVERLAY0x5000
- {
- *(AMR515_DYNAMIC_CODE,AMR515_DYNAMIC_ZI)
- }
- DYNAMIC_CODE30xA001B000OVERLAY0x5000
- {
- *(CTM_DYNAMIC_CODE,CTM_DYNAMIC_ZI)
- }
- DYNAMIC_CODE40xA001B000OVERLAY0x5000
- {
- *(G729_DYNAMIC_CODE,G729_DYNAMIC_ZI)
- }
- DYNAMIC_CODE50xA001B000OVERLAY0x5000
- {
- *(SBC_DYNAMIC_CODE,SBC_DYNAMIC_ZI)
- }
- PRIMARY_EXTSRAM0x400000FIXED0x400000;段的名字是PRIMARY_EXTSRAM,起始地址是0x400000,長度固定為0x400000。
- {
- *.l(+RW)
- *bmt.lib(+RW)
- *adaptation.lib(+RW);所有以adaptation.lib結尾的文件的可讀寫數據放到這里。
- *config.lib(+RW)
- *custom.lib(+RW)
- *drv.lib(+RW)
- *fdm.lib(+RW)
- *init.lib(+RW)
- *kal.lib(+RW)
- *l1_classb.lib(+RW)
- *nucleus.lib(+RW)
- *nucleus_int.lib(+RW)
- *nucleus_debug.lib(+RW)
- *stacklib.lib(+RW)
- *sst.lib(+RW)
- *tst.lib(+RW)
- *mtkapp.lib(+RW)
- *usb.lib(+RW)
- *j2me_hi.lib(+RW)
- *nvram.lib(+RW)
- *nvram_sec.lib(+RW)
- *ft.lib(+RW)
- *irda.lib(+RW)
- *fs.lib(+RW)
- *media.lib(+RW)
- *media_sec.lib(+RW)
- *dsp_ram.lib(+RW)
- ;*plutommi.lib(+RW);代碼被注釋了,無效
- ScreenRotation.obj(+RW)
- wingui.obj(+RW)
- wgui_categories.obj(+RW)
- ;*mmiresource.lib(+RW)
- custNFBProgressImg.obj(+RW)
- gui_wrapper.obj(+RW)
- ;ZIchunk
- *(+ZI);其他所有文件中的數據都放這,且開機時會把這些數據清零。
- }
小結:MTK平臺中關于Scatter文件學習教程的內容介紹完了,希望通過MTK平臺Scatter文件的應用內容的學習能對你有所幫助!