歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> linux內核調試環境的搭建(使用qemu)

linux內核調試環境的搭建(使用qemu)

日期:2017/2/28 15:43:44   编辑:Linux內核
這裡說明下,本人調試的內核版本是2.6.11.12,為什麼去調試這麼“古老”的版本?原因不多說了,你手頭也許正拿著ULK3,而它針對的內核版本正是2.6.11,有比這更好的理由嗎?而且這個版本不算舊,已不算新,我認為還算不錯,想想當下還有如此多的人在學習0.11的道路上笃定的前行,討論關於版本的事情,真的沒什麼意義。只要你認為有用,能學到東西,做什麼別人都不會說你錯!
接下來,我盡量把我碰到的一些棘手或者關鍵的地方都交代清楚,希望看到這篇文章的朋友能順利搭建好自己的環境。good luck!
你手頭需要有VMware,其他的虛擬化工具就不談了,用法差不多。在vmware中,我先後使用Ubuntu 12.04和CentOS 5.1來編譯內核,結果都是失敗!後來google查到原因是這些發布版的gcc太高,而當時在低版本下編譯成的2.6.11內核在這些版本下編譯會報錯,無法正常編譯。不過有不少人說可以將gcc降版本。。。,雖然不是不可行,但是考慮操作可能會比較麻煩等原因,這個方案選擇放棄!
後來得知(通過goole),能天然編譯2.6.11的發布版,有兩種,分別是ubuntu 5.1和RedHat 9.0,他們的內核版本都是2.6.11或者相近的版本。最後我選擇了ubuntu,原因就不說了,都懂的!
我用ubuntu的毛病就是,剛安裝的系統,首先做的事情就是更新source.list文件,後來查到ubuntu已經不再對5.1及一些版本做支持了,所以我用了網上搜到的最新的source.list在升級的時候遇到各種報錯,惡心的要死。
所以我的建議就是不要動source.list,用默認的就可以了。
  1. www.linuxidc.com @localhost:~$ sudo apt-get install build-essential
接下來來要做的第一件事就是安裝build-essential,這個東西是重要的c語言開發包,包含了gcc, make, gdb和libc函數庫等很多工具,編譯c程序所必須的一些東西,因為剛安裝完的ubuntu 5.1基本上是個廢品,gcc根本不能用。
然後我的習慣是給系統安裝ssh,因為安裝完ssh之後,我就可以用xshell和xftp來實現更方便的操作,當然很多人喜歡安裝VMware Tools。 關於如何使用xshell和xftp,就不多講了,反正作用就是為了方便在主機和虛擬機之間傳輸數據,什麼方式都可以。 接下來就是安裝qemu,如果能使用更新的source.list,就可以直接在終端使用sodu apt-get install qemu來完成安裝,但是系統默認的更新源是沒有這個包的,所以選擇使用源碼安裝。
選擇哪個版本?我曾經選擇過最新的版本,首先編譯比較慢,而且編譯之後的可執行文件沒有“qemu”,而是一些qemu-i386,qemu-mips等等。我開始以為qemu-i386是我想要的,但是用了一些網上講的使用方法,貌似不行。不想浪費時間研究了,決定換低的版本試一試。 從最開始的0.10到0.91編譯都有各種報錯,最突出的問題是,這些版本編譯要求系統的gcc是3.x,而當前系統的gcc是4.0.2 20050808,跪了!後來試了很多,最終選擇了0.11.0-rc2,即內部版本為0.11.92,其他的有些版本編譯也會有很多錯誤,根本編譯不過,有的說缺什麼庫,有的源碼裡就有編譯錯誤,shit!反正這個版本是沒有問題的,可以順利編譯。 關於如何找到這個版本,這裡跟大家說下。 首先登陸官網:https://github.com/qemu/QEMU
單擊這個branch:master後面的小三角,在Tags裡面查找即可:
好了,qemu安裝完(直接configure,make,make install)之後,我們就可以編譯2.6.11.12內核了,關於內核編譯,資料多如牛毛,我只使用兩個命令:
  1. www.linuxidc.com @localhost:~$make menuconfig
  2. www.linuxidc.com @localhost:~$make -j4 bzImage
但是這裡有幾個問題要說一下,關於什麼是make menuconfig,不知道的同學去google下,另外執行命令需要ncurses庫的支持,不然你執行 make menuconfig會報錯,這裡大家可以去官網下: http://ftp.gnu.org/pub/gnu/ncurses/ 版本應該問題不大,我選擇的是5.5的版本,因為我看到它的更新日期是2005年,而ubuntu 5.1也是在那個時間發布的,不會用什麼兼容上的問題。
執行menuconfig的時候,我們唯一需要做的工作就是在Kernel hacking項目裡面將Compile the kernel with debug info和Compile the kernel with frame pointers,兩項勾選(在相應項上按空格鍵,裡面都有詳細的說明,不會的同學自己看)。這些項目可以讓編譯時添加調試信息,類似我們平時用的-g選項。
然後make -j4 bzImage,其中-j是讓編譯時使用多核心,你配置的cpu有幾個核心就在後面加上幾,比如我的配置的是四核心,那麼就是-j4。
等一小會兒(機器快的話)之後,內核編譯完成,激動吧。。。。 那麼qemu如何使用呢? 直接終端輸入:
  1. www.linuxidc.com @localhost:~$qemu -s -S -kernle linux-2.6.11.12/arch/i386/boot/bzImage
  2. 參數說明:
  3. -s: qemu在端口1234監聽gdb的調試連接
  4. -S: 讓qemu啟動後暫停,等待gdb的連接
  5. -kernel: 指定bzImage的路徑
由於我目前的關注重點是內核初始化的一些過程,所以更高級的qemu功能先暫時不去研究,後面用到再說。 之後我們另開啟一個終端,在源碼的頂層目錄輸入:
  1. www.linuxidc.com @localhost:~/linux-2.6.11.12$ gdb vmlinux
然後,輸入命令:
  1. (gdb) target remote localhost:1234
  2. Remote debugging using localhost:1234
  3. [New Thread 1]
  4. 0x0000fff0 in ?? ()
  5. warning: shared library handler failed to enable breakpoint
  6. (gdb)
之後我們打個斷點測試下:
  1. (gdb) b start_kernel
  2. Breakpoint 1 at 0xc030e537: file init/main.c, line 417.
  3. (gdb) c
  4. Continuing.
  5. Breakpoint 1, start_kernel () at init/main.c:417
  6. 417 {
  7. (gdb) n
  8. 425 page_address_init();
  9. (gdb)
ok了!後面關於一些使用或者調試的心得,再來跟大家分享!
Copyright © Linux教程網 All Rights Reserved