前些時候一直不明白"memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);"的用途,今天算是了解了,就是將異常向量表放到0地址處、發生異常的時候CPU總是跳轉到這里取指執行。
如果這里沒有異常向量表、異常就得不到處理、而且CPU還無法從這個區域返回到跳轉之前的地方。
圖中左邊是反匯編代碼、可以看到機器碼。
而且由于映像文件的入口地址Image
所以圖中的代碼是從0x30000000開始存放(標號'ResetEntry'在0x30000000地址處)。
注意每條語句的機器碼(方括號'[XXX]'里面的數據)。
右邊是打開的用來下載.bin文件、里面就是機器碼。
它和反匯編里面的機器碼一樣、注意是little
運行 memcpy((unsigned char *)0x0,(unsigned char *)0x30000000,0x1000);語句之前、0地址處的值都是FF。
運行完畢之后、0地址處的值如下圖
這條語句是從0x30000000處開始、復制4K代碼到0地址處。
上圖中從0地址開始的代碼和.bin文件里面的代碼一樣、而且只是前4K一樣。
就我的板子TX-2440來說 :
如果是Norflash啟動、那么0地址在Norflash,就是復制到Norflash。
如果是Nandflash啟動、那么0地址在BootRAM,就是復制到BootRAM。
語句這樣做的目的是將異常向量表復制到0地址處、因為發生異常的時候、CPU自動跳轉到0地址處讀取指令。
要是0地址處沒有這個異常向量表、那么就無法處理異常,中斷就無法執行,含有中斷的程序就會出錯,
CPU無法返回到跳轉之前的地方。
沒有這條復制語句、那么0x0~0x30000000之間的內存里絕大多數是FF、少數是00 :