1. 程式人生 > >QEMU+GDB環境下除錯NOVA微核心

QEMU+GDB環境下除錯NOVA微核心

       為了更好的學習與瞭解一個OS微核心,瞭解微核心的程式碼如何執行十分必要,因此學會如何除錯觀察微核心的程式便是更好的學習與瞭解一個核心程式碼的開始。我學習的是Fiasco微核心系列中的基於x86體系的多核輕量級微核心NOVA,我們知道核心程式不能直接放在一般的IDE環境中執行,需要在硬體平臺或者虛擬硬體平臺上執行,在這我選用的是qemu這個虛擬平臺。

環境搭建  

   執行檔案形式搭建如下:

    此環境搭建可借鑑我的另外一篇博文:https://blog.csdn.net/qq_40326481/article/details/79434934

     然後將由kern和user中的原始碼make生成的兩個elf可執行檔案放入boot資料夾:

make run寫在環境最外層,執行後結果如下:

      我們可以看到nova微核心已經在qemu虛擬平臺上啟動,因為我們的使用者層寫的是空迴圈沒有加任何操作,暫時核心沒有被呼叫,但這不影響先學習核心的啟動過程。

       接下來是要使用gdb來除錯qemu上的核心程式,簡單的介紹gdb是一款linux系統上的程式除錯工具,在這它可以遠端除錯qemu上的核心程式。

       要將gdb連結上qemu平臺,我們需要在makefile檔案的make run啟動命令中加入以下命令引數:

     

 其中-gdb tcp::1234 代表設定gdb遠端除錯埠,也可以用-s替換,會預設設定1234為gdb遠端連結埠。

-S為啟動後暫停qemu載入程式執行指令,以方便在gdb中除錯時先加斷點再執行。

在make run之前,我們還需在kern和user檔案的makefile檔案中加入-g命令引數重新make生成elf檔案,這是為了生成供gdb除錯的除錯資訊檔案.


重新make run後結果如下:

然後開啟另一個終端。開啟gdb,輸入 target remote:1234連線qemu平臺,在輸入file   核心elf檔案的路徑,便可準備開始除錯:

GDB除錯

GDB主要功能:

1. 啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式

2. 可讓被除錯的程式在你所指定的斷點處停住(斷點可以是條件表示式)

3. 當程式被停住時,可以檢查此時你的程式所發生的事情

4.動態的改變你的程式的執行環境

GDB相關除錯命令:

(gdb)target remote:1234   ------遠端連結qemu平臺

(gdb)file  elf檔案路徑          ------載入要除錯的檔案

(gdb)b  函式名/檔案行數     ------打斷點

(gdb)c                                 ------繼續執行至斷點處

(gdb)list/l                            ------顯示原始碼

(gdb)p 變數名                      ------顯示變數

(gdb)info b/break/breakpoints ------顯示斷點資訊

(gdb) info reg                      ------顯示暫存器資訊

(gdb)s                                      -------執行一行源程式程式碼,如果此行程式碼中有函式呼叫,則進入該函式

   (gdb)  n                                      -------執行一行源程式程式碼,此行程式碼中的函式呼叫也一併執行

   (gdb) display /i$pc                     -------除錯彙編指令,且每次程式中斷後可以看到即將被執行的下一條彙編指令

   (gdb) undisplay 1                       -------取消先前的display設定,編號從1開始遞增

整體原始碼見:https://github.com/chencoolboy/NOVA-QEMU-GDB-

相關推薦

QEMU+GDB環境除錯NOVA核心

       為了更好的學習與瞭解一個OS微核心,瞭解微核心的程式碼如何執行十分必要,因此學會如何除錯觀察微核心的程式便是更好的學習與瞭解一個核心程式碼的開始。我學習的是Fiasco微核心系列中的基於x86體系的多核輕量級微核心NOVA,我們知道核心程式不能直接放在一般的ID

VS環境除錯ABAQUS子程式的處理辦法

設定除錯環境 for中新增暫停程式碼 logical :: firstrun = .true. integer tempvar if(firstrun) then write(*,*)"please input an integer:" read(*,*)te

linux環境除錯程式碼

//建立檔案test.c [[email protected] code]$ touch test.c [[email protected] code]$ ls test.c //編輯test.c [[email protected

Bochs + GDB 原始碼級除錯C語言核心

環境: Ubuntu 14.04 64bit Bochs 2.6.6 GDB 7.7 想要原始碼級除錯C核心,需要在編譯Bochs時加上 --enable-gdb-stub 引數 sudo ./configure --enable-all-optimizations --enable-long-phy-

pycharm配置遠端環境除錯

下面以配置centos7遠端除錯為例進行說明。1.開啟pycharm。2.開啟Tools->Deployment->configration..3.點選“+”新增一個新的Deployment配置。6.在connection的tab設定基本資訊7.通過高階選項配置檔

vs2010環境除錯程式出現0xc000007b問題

先說下自己的情況:          用MKL時一直出現 0xc000007b  搜了很多,下面這篇幫助最大。        問題是在Linker->Input裡面:先是用的libguide40.lib,這時出現錯誤。改成libguide.lib後正常運行了!    

linux環境編譯linux0.11核心

原部落格很老了,我並沒有編譯通過,網上大多編譯成功的是用gcc-4.3以下的版本,也有在gcc-4.6編譯成功的,折騰了幾天,這是我在網上找到的最新的資料了, 但是ubuntu源裡面最老的版本也是gcc4.7版本的,嘗試編譯低版本的gcc原始碼,但編譯不通過. 上面的

macbook環境從iphone信中匯出語音檔案

What 手機微信不支援儲存語音訊息到本地,而微信中儲存的音訊格式aud基本上所有的播放器都沒法直接播放,需要進一步處理 Why 想把微信裡面的語音詳細儲存到本地,做進一步處理 How 主要是二步,先使用tools把微信中的音訊檔案aud匯出到macb

docker環境部署的服務架構: zookeeper和kafka部署

轉載自:http://www.jianshu.com/p/263164fdcac7 kafka簡單介紹 Kafka 是 LinkedIn 開源的一種高吞吐量的分散式釋出訂閱訊息系統,kafka的誕生就是為了處理海量日誌資料,所以kafka處理訊息的效率非常高,即使是非常

Android環境GDB除錯

gdb是GNU開發的針對Linux/Unix環境下程式的除錯工具。為了節約目標系統的資源,gdb通常採用gdb+gdbserver的方式進行除錯。 在Android GDB除錯場景下,gdb執行在PC端,gdbserver執行在Android系統中。在實際的除錯過程中,PC端的gdb參照

qemu + gdb 除錯核心

原文轉載自 https://blog.csdn.net/hoppboy/article/details/16886515 參考文章: http://blog.csdn.net/heli007/article/details/7187586  (比較推薦) http://

使用Qemu+gdb除錯核心

昨天聽別人講使用Qemu和gdb來實現原始碼級核心除錯,今天試了一下,果然非常方便,現簡單的記錄一下。 Qemu是一個開源的虛擬機器軟體,能夠提供全系統的模擬,可以執行在多個平臺上,並模擬多個別的平臺。Qemu虛擬機器是採用動態翻譯來實現CPU的模擬的,對硬體的依賴程度低,

QEMU+GDB除錯核心

    用GDB來除錯使用者態程式是一個方便快捷的定位問題的方法,極大的縮短了除錯程式和定位問題的時間。而對於核心或者驅動ko的除錯或者我們想了解核心執行的某些過程,我們也可以藉助於gdb工具。    GDB+QEMU的方式是一種比較常見的除錯核心和驅動的方法,這裡寫的是我在

Linux環境使用GDB除錯C程式

寫這篇部落格的目的是因為我剛剛用gdb解決了一個c語言中賦錯了值的問題,導致整個程式的執行結果是不正常的,這是我求助於gdb解決了這個問題,之前也用gdb這個神器解決過一些執行時的記憶體問題,比如說c程式中非常常見的segment error。這篇部落格為了對g

修改,編譯,GDB除錯openjdk8原始碼(docker環境)

在上一章《在docker上編譯openjdk8》裡,我們在docker容器內成功編譯了openjdk8的原始碼,有沒有讀者朋友產生過這個念頭:“能不能修改openjdk原始碼,構建一個與眾不同的jdk“,今天我們就來閱讀一些openjdk的原始碼,再嘗試做些小改

qemu&buildroot&gdb 建立x86除錯環境

##qemu & buildroot & gdb 建立x86除錯環境 本文只針對模擬x86環境 本機環境: 作業系統:Debian GNU/Linux 8.6 (jessie) CPU 架構: Intel(R) Core(TM) i5-4

QEMU+gdb除錯Linux核心全過程

1、編譯原始碼(Linux kernel 4.6.2) make menuconfig 執行make menuconfig時報錯缺少庫檔案 需要安裝依賴庫 sudo apt-get install aptitude sudo aptitude i

在Linux執行Qemu模擬AArch64硬體除錯核心

環境說明: Fedora21 x86_64 ARM公司推出ARM V8架構後,全面進入64位CPU時代,可是目前市場上出現的裝置太少或者說價效比不高,但是又想做相關平臺下的開發,那麼可以考慮下使用qemu模擬器 安裝aarch64-qemu: $

Mac環境安裝PHP及使用xdebug除錯

Mac環境下安裝PHP及使用xdebug除錯 最近在公司裡需要寫一些PHP指令碼,因此又重新看了一下PHP的基礎語法.由於本人的使用Mac,因此這裡僅以Mac下PHP的安裝及使用xdebug除錯為例,記錄環境搭建步驟. 安裝PHP Mac下home-brew是一個非常優秀便捷的包管理器,

判斷是否為環境打開的網頁

網頁 mes tel doc 微信瀏覽器 agent mic tolower fun 非微信瀏覽器條件下隱藏某些東西: function isWeiXin(){ var ua = window.navigator.userAgent.toLowerCase