Linux做爲目前最爲流行的開源操做系統,在各大IC廠商和IBM、Google、微軟等大公司的大力支持下,支持嵌入式、我的電腦、服務器等衆多硬件平臺和應用場景,所以獲得了普遍的應用。但正是因爲其普遍的實用性,Linux內核的複雜程度也與日俱增,僅憑代碼閱讀、打印、內核調試功能等手段已經很難對Linux內核進行深刻理解。linux
ARM處理器架構是目前應用最爲普遍的處理器,而ARM FVP(Fixed Virtual Platform,固定虛擬平臺)是ARM公司提供的一款模擬器平臺,能夠模擬各大常見ARM處理器廠商的處理器和平臺,從而使得在沒有仿真器的支持下對Linux內核進行調試。git
ARM DS-5是ARM公司提供的調試套件,內嵌了FVP,可用於實際硬件環境和模擬器環境的調試。本文集中於使用DS-5對運行在FVP平臺上的Linux內核的調試。express
本文使用的環境以下:服務器
關鍵詞:ARM模擬器; Linux內核調試;ARM FVP;ARM DS-5;架構
1.下載DS-5;app
tar xzf DS500-BN-00019-r5p0-27rel1.tgz -C <解壓縮目錄>
sudo ./install.sh
啓動DS-5:
/usr/local/DS-5_v5.27.1/bin/eclipse &
注意:啓動過程當中會提示選擇workspace,根據須要選擇便可,默認爲home目錄下的DS-5_Workspace。eclipse
選擇上圖所示的打開License管理器便可。函數
Help->ARM License Maneger
,打開License管理器;在License管理器中選擇添加license:
工具
選擇license類型爲30天版本:
post
選擇用於license綁定的網卡:
註冊ARM官網帳號並填寫帳號密碼:
帳號信息輸入正確後會開始聯網申請license,成功後顯示以下界面,而後確認重啓DS-5便可:
File->Import
,進入導入類型選擇頁面,並選擇圖中所示類型,點擊下一步:distribution
工程,並點擊Finish完成導入:distribution
;依次點擊菜單Run->Debug Configuration
,打開調試配置界面以建立新鏈接:
DS-5 Debugger
建立新鏈接;duplication
也能夠建立新鏈接;Name
項來修改。在上圖所示Connection
選項頁中選擇硬件模型Debug Cortex-A9x4 SMP
(ARM vexpress Cortex-A9 4核處理器平臺SMP模式),並修改上圖所示的模型參數:
注意:--data "/usr/local/DS-5_v5.27.1/arm/linux_distribution/kernel_ve@0x80008000" --data "/usr/local/DS-5_v5.27.1/arm/linux_distribution/rtsm_ve-cortex_a9x4.dtb@0x80f00000" -C motherboard.mmc.p_mmc_file="/usr/local/DS-5_v5.27.1/arm/linux_distribution/rootfs.image" -C motherboard.vfs2.mount=
-C motherboard.terminal_3.start_telnet=false -C motherboard.terminal_3.mode=raw -C motherboard.pl011_uart3.untimed_fifos=true -C motherboard.terminal_3.start_port=5003 -C motherboard.smsc_91c111.enabled=1 -C motherboard.hostbridge.userNetworking=1 -C motherboard.hostbridge.userNetPorts="8080=8080"
--data file_path@load_adddress
參數用於加載文件到指定的位置;-C parametr=value
用於設定模擬器的參數,模擬器參數可使用以下命令列舉出來:
/usr/local/DS-5_v5.27.1/bin/FVP_VE_Cortex-A9x4 --list-params
在上圖所示Files
選項頁中設置引導程序和Linux內核符號表:
注意:引導程序用於對Linux內核進行基本的初始化,並加載操做系統;此處使用DS-5自帶的32位bootwrapper,僅用於示例代碼。
設置從內核入口地址啓動:
注意:若是源代碼不在工程目錄下,則須要設置源碼搜索路徑。
點擊調試配置界面中的Apply
按鈕保存配置;
點擊調試配置界面中的Debug
按鈕或者右鍵點擊調試鏈接名稱選擇Connect to Target
開始調試。
注意:第一次運行時,會彈出Confirm Perspective Switch
對話框,選擇Yes
便可。
控制界面:用於resume、puase、step、step over等操做。
命令和命令歷史界面:用於顯示命令流、命令結果、命令執行歷史等。
信息查看界面1:查看和修改寄存器、斷點、變量、函數等。
Ctrl+F
喚出搜索框;信息查看界面2:查看函數調用棧、函數大綱、事件、內存等,修改內存內容,並可實時顯示當前對應的彙編指令和跳轉到指定的彙編指令等。
源碼跟蹤界面:顯示源碼級實時跟蹤、設置斷點、強制跳轉等。
終端界面:顯示終端和錯誤記錄。
此處以64位處理器ARM Cortex-A53處理器爲例,給予官方demo進行調整後,對32位Linux內核進行調試。
因爲自帶的bootwrapper僅支持32位處理器,所以必須本身編譯64位版本。
從kernel.org bootwrapper項目克隆源碼:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/mark/boot-wrapper-aarch64.git
配置bootwrapper:
注意:cd boot-wrapper-aarch64
./configure --host=aarch64-linux-gnu --with-kernel-dir=~/tmp/linux-32/tmparm --with-dtb=~/tmp/fvp-base-gicv3-psci.dtb --enable-gicv3
--host
用於指定編譯工具;--with-kernel-dir
用於指定內核映像目錄,--with-dtb
用於指定DTB文件,從而將這些文件連接到中最終的image文件中;./configure --help
獲取;編譯
make
基於3.2章節流程,進行以下修改:
Connection
選項頁中選擇硬件模型Debug Cortex-A53
,並修改上圖所示的模型參數:
注意:-C bp.secure_memory=false
用於解決模擬器報錯:
Files
選項頁中設置引導程序和符號表:
設置從入口地址啓動和源碼搜索路徑:
A53模擬器啓動後工做在64位EL3模式下,不能加載32位符號表:
所以,必須以以下方式加載:
在bootwrapper的模式切換指令處設置斷點:
單步執行進入32位模式後,在命令和命令歷史界面的命令輸入框中手動加載Linux內核的符號表:
add-symbol
命令用於加載符號表到指定的位置,格式爲add-symbol-file filename [offset] [-s section address]...
;其中,offset
用於指定符號表中連接地址的偏移量,具體使用方法參見Help
信息中ARM DS-5 Documentation > ARM DS-5 Debugger > Debugger Command Reference > DS-5 Debugger commands > DS-5 Debugger commands listed in alphabetical order
章節。繼續跟蹤源碼:
相對與其餘模擬器平臺,例如QEMU,FVP對ARM處理器的支持更爲完善和強大,即便須要註冊和30天序列號的限制,仍然不失爲研究Linux內核的一款利器。