KEIL MDK輸出map文件分析01
果然,在剛開始執(zhí)行程序時(shí),R10和R11的值就已經(jīng)被賦值成了這兩個(gè)值。
很快就將0x08002dc0到0x08002dcf處的16個(gè)字節(jié),4個(gè)雙字加載到了R0-R3,我們可以分析一下里面的內(nèi)容,R0就是程序加載視圖的RW區(qū)的起始地址(0x08002de0),R1就是要輸出的執(zhí)行視圖的RW區(qū)的地址(0x20000000),R2就是要復(fù)制的RW數(shù)據(jù)的個(gè)數(shù),R3是復(fù)制函數(shù)(__scatterload_copy)的地址,類似于一個(gè)回調(diào)函數(shù)。接下來(lái)就要用了:0x0800011E 4718
下來(lái)又將0x08002dd0到0x08002ddf處的16個(gè)字節(jié),4個(gè)雙字加載到了R0-R3,我們可以分析一下里面的內(nèi)容,R0就是程序加載視圖的RW區(qū)的起始地址(0x08002de0+0x20=0x08002e00),R1就是要輸出的執(zhí)行視圖的RW區(qū)的地址(0x20000020),R2就是要復(fù)制的RW數(shù)據(jù)的個(gè)數(shù),R3是ZI區(qū)域建立函數(shù)(__scatterload_zeroinit
執(zhí)行完成后,程序就會(huì)進(jìn)入BL.W
經(jīng)過(guò)這么一分析,現(xiàn)在我對(duì)于程序的加載映像和執(zhí)行映像有了較深的理解:程序的RO_Code加上RO_Data總共是0x2dc0這么大,地址范圍0x0800,0000到0x8000,2dbf。然后在0x0800,2dc0-2dcf共16個(gè)字節(jié)放了RW加載映像地址(0x0800,2de0)、執(zhí)行映像地址(0x2000,0000)、RW長(zhǎng)度(0x20)和將該段數(shù)據(jù)從加載映像復(fù)制到執(zhí)行映像的函數(shù)地址。在0x0800,2dd0-2ddf共16個(gè)字節(jié)放了ZI加載映像地址(0x0800,2e00)、執(zhí)行映像地址(0x2000,0020)、ZI長(zhǎng)度(0x480)和建立ZI、HEAP和STACK執(zhí)行映像的函數(shù)地址。
在上面的第二個(gè)階段,將ZI清零階段,程序的ZI長(zhǎng)度實(shí)際上只有0x20,而庫(kù)代碼留出了0x60的長(zhǎng)度。因此數(shù)據(jù)區(qū)的頂端為0x2000,00a0-1。接下來(lái)從0x2000,00a0開始為堆的起始地址,堆長(zhǎng)度加上程序棧長(zhǎng)度為0x2000,04a0,這就是堆棧頂端,也是__initial_SP的初始值。
程序進(jìn)入_rt_entry后,還要對(duì)heapstack進(jìn)行處理,但我沒有看到有什么用的變化。從中對(duì)庫(kù)留出的ZI數(shù)據(jù)區(qū)進(jìn)行了一些處理,我暫時(shí)也看不明白。好了,調(diào)試就到這里,回到map文件分析的正途。
5、第五部分:
Memory Map of the image
//映像的內(nèi)存分布
//程序的入口點(diǎn):這里應(yīng)該是RESET_Handler的地址
評(píng)論