ARM FVP(固定虛擬平臺)Linux內核調試簡明手冊

1. 介紹

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

本文使用的環境以下:服務器

  • 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;app

  1. 解壓縮安裝包:
    tar xzf DS500-BN-00019-r5p0-27rel1.tgz -C <解壓縮目錄>
  2. 進入解壓縮目錄,執行以下命令進行安裝:
    sudo ./install.sh
    注意:安裝過程當中建議都採用會默認設置,DS-5將默認安裝到/usr/local/目錄下,本文中是在/usr/local/DS-5_v5.27.1/。

2.2 獲取序列號

  1. 啓動DS-5:
    /usr/local/DS-5_v5.27.1/bin/eclipse &
    注意:啓動過程當中會提示選擇workspace,根據須要選擇便可,默認爲home目錄下的DS-5_Workspace。eclipse

  2. 申請license:
    • 第一次啓動DS-5時,會彈出對話框,提示須要一個有效的序列號,選擇Open License Maneger便可打開License管理器;

    選擇上圖所示的打開License管理器便可。函數

    • 依次點擊菜單Help->ARM License Maneger,打開License管理器;
  3. 在License管理器中選擇添加license:
    工具

  4. 選擇license類型爲30天版本:
    post

  5. 選擇用於license綁定的網卡:

  6. 註冊ARM官網帳號並填寫帳號密碼:

    注意
    • 已有帳號則無需註冊;
    • 註冊時ARM會發送一個6位驗證碼,註冊信息主要是郵箱、姓名和單位等;
  7. 帳號信息輸入正確後會開始聯網申請license,成功後顯示以下界面,而後確認重啓DS-5便可:

3. 調試官方Linux內核demo

3.1 準備

  1. 下載DS-5 Linux Distribution Example;
  2. 依次點擊菜單File->Import,進入導入類型選擇頁面,並選擇圖中所示類型,點擊下一步:
  3. 在已存在工程導入頁面選擇壓縮包方式導入,勾選DS-5掃描出來的distribution工程,並點擊Finish完成導入:

    注意
    • DS-5會自動搜索壓縮包中的工程,此處是distribution
    • 工程必須手工鉤選;
    • 工程不能重複導入同一個worksapce;
    • 完成導入後,源碼會被拷貝到workspace目錄下:

3.2 建立調試鏈接和啓動FVP

  1. 依次點擊菜單Run->Debug Configuration,打開調試配置界面以建立新鏈接:

    注意
    • 雙擊或右鍵點擊上圖左邊欄中箭頭所示的DS-5 Debugger建立新鏈接;
    • 右鍵點擊任何已有鏈接並選擇duplication也能夠建立新鏈接;
    • 新鏈接能夠經過上圖中紅圈中的Name項來修改。
  2. 在上圖所示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

  3. 在上圖所示Files選項頁中設置引導程序和Linux內核符號表:

    注意:引導程序用於對Linux內核進行基本的初始化,並加載操做系統;此處使用DS-5自帶的32位bootwrapper,僅用於示例代碼。

  4. 設置從內核入口地址啓動:

    注意:若是源代碼不在工程目錄下,則須要設置源碼搜索路徑。

  5. 點擊調試配置界面中的Apply按鈕保存配置;

  6. 點擊調試配置界面中的Debug按鈕或者右鍵點擊調試鏈接名稱選擇Connect to Target開始調試。

注意:第一次運行時,會彈出Confirm Perspective Switch對話框,選擇Yes便可。

3.3 基本調試操做

  1. 控制界面:用於resume、puase、step、step over等操做。

  2. 命令和命令歷史界面:用於顯示命令流、命令結果、命令執行歷史等。

  3. 信息查看界面1:查看和修改寄存器、斷點、變量、函數等。

    注意
    • 寄存器和函數界面中可使用Ctrl+F喚出搜索框;
    • 寄存器值、變量值、斷點地址、函數名稱等都可右鍵喚出相關菜單,執行反彙編、查看內存、跳轉等操做。
  4. 信息查看界面2:查看函數調用棧、函數大綱、事件、內存等,修改內存內容,並可實時顯示當前對應的彙編指令和跳轉到指定的彙編指令等。

  5. 源碼跟蹤界面:顯示源碼級實時跟蹤、設置斷點、強制跳轉等。

  6. 終端界面:顯示終端和錯誤記錄。

4. 調試自定義Linux內核

此處以64位處理器ARM Cortex-A53處理器爲例,給予官方demo進行調整後,對32位Linux內核進行調試。

4.1 編譯bootwrapper

因爲自帶的bootwrapper僅支持32位處理器,所以必須本身編譯64位版本。

  1. kernel.org bootwrapper項目克隆源碼:

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/mark/boot-wrapper-aarch64.git

  2. 配置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/
  3. 編譯

    make

4.2 建立調試鏈接和啓動FVP

基於3.2章節流程,進行以下修改:

  1. Connection選項頁中選擇硬件模型Debug Cortex-A53,並修改上圖所示的模型參數:

    注意-C bp.secure_memory=false用於解決模擬器報錯:

  2. Files選項頁中設置引導程序和符號表:

  3. 設置從入口地址啓動和源碼搜索路徑:

4.3 調試32位Linux內核

A53模擬器啓動後工做在64位EL3模式下,不能加載32位符號表:

所以,必須以以下方式加載:

  1. 在bootwrapper的模式切換指令處設置斷點:

  2. 單步執行進入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章節。
  3. 繼續跟蹤源碼:

4. 結語

相對與其餘模擬器平臺,例如QEMU,FVP對ARM處理器的支持更爲完善和強大,即便須要註冊和30天序列號的限制,仍然不失爲研究Linux內核的一款利器。

參考文獻

相關文章
相關標籤/搜索