ARM FVP(固定虚拟平台)Linux内核调试简明手册
1. 介紹
2. DS-5準備工作
2.1 DS-5下載安裝
2.2 獲取序列號
3. 調試官方Linux內核demo
3.1 準備
3.2 創建調試連接和啟動FVP
3.3 基本調試操作
4. 調試自定義Linux內核
4.1 編譯bootwrapper
4.2 創建調試連接和啟動FVP
4.3 調試32位Linux內核
4. 結語
參考文獻
1. 介紹
Linux作為目前最為流行的開源操作系統,在各大IC廠商和IBM、Google、微軟等大公司的大力支持下,支持嵌入式、個人電腦、服務器等眾多硬件平臺和應用場景,因此得到了廣泛的應用。但正是由于其廣泛的實用性,Linux內核的復雜程度也與日俱增,僅憑代碼閱讀、打印、內核調試功能等手段已經很難對Linux內核進行深入理解。
ARM處理器架構是目前應用最為廣泛的處理器,而ARM FVP(Fixed Virtual Platform,固定虛擬平臺)是ARM公司提供的一款模擬器平臺,可以模擬各大常見ARM處理器廠商的處理器和平臺,從而使得在沒有仿真器的支持下對Linux內核進行調試。
ARM DS-5是ARM公司提供的調試套件,內嵌了FVP,可用于實際硬件環境和模擬器環境的調試。本文集中于使用DS-5對運行在FVP平臺上的Linux內核的調試。
本文使用的環境如下:
Ubuntu 16.04 LTS(Xenial);
DS-5 V5.27.1
關鍵詞:ARM模擬器; Linux內核調試;ARM FVP;ARM DS-5;
2. DS-5準備工作
2.1 DS-5下載安裝
1.下載DS-5;
2. 解壓縮安裝包:
tar xzf DS500-BN-00019-r5p0-27rel1.tgz -C <解壓縮目錄>
3. 進入解壓縮目錄,執行如下命令進行安裝:
sudo ./install.sh
注意:安裝過程中建議都采用會默認設置,DS-5將默認安裝到/usr/local/目錄下,本文中是在/usr/local/DS-5_v5.27.1/。
2.2 獲取序列號
啟動DS-5:
/usr/local/DS-5_v5.27.1/bin/eclipse &
注意:啟動過程中會提示選擇workspace,根據需要選擇即可,默認為home目錄下的DS-5_Workspace。
申請license:
第一次啟動DS-5時,會彈出對話框,提示需要一個有效的序列號,選擇Open License Maneger即可打開License管理器;
選擇上圖所示的打開License管理器即可。
依次點擊菜單Help->ARM License Maneger,打開License管理器;
在License管理器中選擇添加license:
選擇license類型為30天版本:
選擇用于license綁定的網卡:
注冊ARM官網賬號并填寫賬號密碼:
注意:
已有賬號則無需注冊;
注冊時ARM會發送一個6位驗證碼,注冊信息主要是郵箱、姓名和單位等;
賬號信息輸入正確后會開始聯網申請license,成功后顯示如下界面,然后確認重啟DS-5即可:
3. 調試官方Linux內核demo
3.1 準備
下載DS-5 Linux Distribution Example;
依次點擊菜單File->Import,進入導入類型選擇頁面,并選擇圖中所示類型,點擊下一步:
在已存在工程導入頁面選擇壓縮包方式導入,勾選DS-5掃描出來的distribution工程,并點擊Finish完成導入:
注意:
DS-5會自動搜索壓縮包中的工程,此處是distribution;
工程必須手工鉤選;
工程不能重復導入同一個worksapce;
完成導入后,源碼會被拷貝到workspace目錄下:
3.2 創建調試連接和啟動FVP
依次點擊菜單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即可。
3.3 基本調試操作
控制界面:用于resume、puase、step、step over等操作。
命令和命令歷史界面:用于顯示命令流、命令結果、命令執行歷史等。
信息查看界面1:查看和修改寄存器、斷點、變量、函數等。
注意:
寄存器和函數界面中可以使用Ctrl+F喚出搜索框;
寄存器值、變量值、斷點地址、函數名稱等均可右鍵喚出相關菜單,執行反匯編、查看內存、跳轉等操作。
信息查看界面2:查看函數調用棧、函數大綱、事件、內存等,修改內存內容,并可實時顯示當前對應的匯編指令和跳轉到指定的匯編指令等。
源碼跟蹤界面:顯示源碼級實時跟蹤、設置斷點、強制跳轉等。
終端界面:顯示終端和錯誤記錄。
4. 調試自定義Linux內核
此處以64位處理器ARM Cortex-A53處理器為例,給予官方demo進行調整后,對32位Linux內核進行調試。
4.1 編譯bootwrapper
由于自帶的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獲取;
模擬器對應的硬件平臺的DTB文件可以從Linaro發行版目錄下載,例如本例所用的DTB文件來自于archive/14.09/openembedded/aarch64/。
編譯
make
4.2 創建調試連接和啟動FVP
基于3.2章節流程,進行如下修改:
Connection選項頁中選擇硬件模型Debug Cortex-A53,并修改上圖所示的模型參數:
注意:-C bp.secure_memory=false用于解決模擬器報錯:
Files選項頁中設置引導程序和符號表:
設置從入口地址啟動和源碼搜索路徑:
4.3 調試32位Linux內核
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章節。
繼續跟蹤源碼:
4. 結語
相對與其他模擬器平臺,例如QEMU,FVP對ARM處理器的支持更為完善和強大,即使需要注冊和30天序列號的限制,仍然不失為研究Linux內核的一款利器。
參考文獻
Debugging a Linux Symmetric Multi-Processing (SMP) Kernel using DS-5
DS-5教程-ARM DS-5配合DSTREAM仿真器調試Linux和Android內核
使用ARM DS-5探究Linux Kernel booting過程
總結
以上是生活随笔為你收集整理的ARM FVP(固定虚拟平台)Linux内核调试简明手册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 判断字符串什么编码类型
- 下一篇: c语言结构体5之匿名结构体