測試代碼如程序清單 1.1所示:app
程序清單 1.1工具
#include <stdio.h>測試
int main (int argc, char **argv)spa
{命令行
sleep(2);debug
volatile int *a = (int *)0x40; //設置物理地址內存
printf("value = %x\n",*a); //讀取物理地址中的值源碼
*a = 0x12; //設置物理地址中的值it
return (0);io
}
在mini2440模擬器上的運行結果如圖 2.1所示:
圖 2.1模擬器運行結果
標號4處表示內存訪問錯誤類型,這裏是can not write,意思就是系統執行了一個寫內存的操做,可是這個內存地址是不容許寫的,從而引發內存錯誤
本測試程序是用debug模式編譯所得,將測試程序和sylixos-objdump工具拷貝到同一個目錄下,如圖 3.1所示:
圖 3.1拷貝測試程序和反彙編工具
在空白處按住shift並右擊,選擇"在此處打開命令窗口",如圖 3.2所示:
圖 3.2打開命令窗口
在打開的命令行中輸入:arm-sylixos-eabi-objdump.exe -S -d 2440_test_app >app.dis,在同一目錄下將生成一個app.dis反彙編文件,如圖 3.3所示:
圖 3.3生成反彙編文件
由以前分析得知,測試程序的加載地址=0x60030000,引發錯誤的那條指令在內存中的地址=0x600302ec。因此能夠計算出引發錯誤的那條指令在內存中的偏移爲0x600302ec-0x60030000=0x2ec。這個地址就是引發錯誤的那條指令在反彙編文件的彙編地址,如圖 4.1所示:
圖 4.1查看反彙編文件
能夠看出0x2ec彙編地址處對應的是一條寫內存指令,對應的c語句是"*a = 0x12",這就是源碼中出錯的地方。經過這個測試也發現了SylixOS下的一個有意思的地方,那就是非法地址能夠讀,可是不能寫。