利用Qemu搭建核心除錯環境

2021-06-22 05:35:33 字數 2929 閱讀 2285

一、核心除錯的原理

傳統除錯核心需要配置兩台linux主機,其中一台主機稱為開發機,另一台主機稱為目標機。開發機中除了有乙個可執行的linux環境,還應包含必要的開發環境(gcc、gdb、make等)以及核心原始碼,目標機則需要能夠啟動核心並掛載乙個有效的檔案系統,可以將執行在目標機中待除錯核心稱為目標核心,目標核心在開發機中編譯。為了使後續核心除錯過程能夠順利進行,在編譯核心前需要對其做如下配置選項的選擇:

開啟除錯資訊選項,這樣在編譯出的目標核心中會包含符號表等除錯資訊。

早期核心需要為原始碼打kgdb補丁,現在kgdb已經合併到2.6.26版之後的核心中,所以不再需要打這個補丁,但編譯前仍需將kdgb的配置選項開啟。

目標機網絡卡驅動程式、tcp/ip協議棧及相關的通訊軟體(ftp, ssh等)。

序列口驅動程式。

init程式。這是目標核心啟動後執行的第乙個程式,可以將busybox提供的linuxrc改名為init即可獲得。

如果需要除錯核心模組,那麼需要包含幾個用於處理核心模組的程式(insmod、rmmod等)。同時待除錯的核心模組在開發機中編譯好之後,也一併包含在initramfs映象中。

如果需要除錯系統呼叫,那麼還要包含用於觸發系統呼叫的應用程式。這個應用程式也是在開發機中編譯好之後被放入initramfs映象中。

具體製作initramfs的方法可以參考《qemu虛擬機器中掛載nfs》。假設利用busybox建立的initramfs映象檔案名為image.cpio.gz,並將其放在核心原始碼的頂層目錄中,那麼在開發機中用下面的命令就可以在啟動目標核心的同時載入initramfs映象檔案:

qemu -kernel arch/x86/boot/bzimage -initrd image.cpio.gz

四、除錯目標核心

目標核心啟動後,在開發機中就可以利用gdb對其進行除錯。但這裡還有乙個開發機與目標機通訊的問題。一方面,前面提到過qemu提供了乙個gdb stub,用於控制目標核心的執行。另一方面,開發機中執行的gdb可以通過乙個指定的tcp埠與該stub聯絡,從而向stub發出除錯命令同時接收stub向其返回的目標核心執行狀態。qemu提供的-gdb選項就是用於指定這樣乙個tcp埠。

qemu -kernel arch/x86/boot/bzimage -initrd image.cpio.gz -gdb tcp::1234 &

上面的命令指定tcp埠號1234用於gdb與stub之間的通訊。此時qemu在後台執行,接下來就可以在命令列上啟動gdb對目標核心做除錯了。

gdb vmlinux

(gdb) target remote localhost:1234

在gdb中會看到它在乙個斷點處接管了目標核心的執行,此時可以利用gdb的各種命令來完成檢視變數、設定斷點、單步執行、讓目標核心繼續執行等除錯操作。

實際上,上面啟動qemu的命令還可以這樣寫:

qemu -kernel arch/x86/boot/bzimage -initrd image.cpio.gz -s &

其中的-s選項與「-gdb tcp::1234」是完全等價的。

五、開發機與目標機共享檔案系統

在核心除錯過程中,經常需要將開發機中生成的檔案(例如,核心模組、應用程式)傳送到目標機中,所以需要在開發機和目標機之間共享檔案。如果採用網路傳送(ssh或ftp等)或u盤拷貝固然可行,但比較麻煩並且效率很低,所以可以考慮利用nfs實現兩機共享同乙個檔案系統。具體的思路是:在開發機中搭建乙個nfs伺服器,並將開發機的根檔案系統匯出。然後在目標機中掛載開發機匯出的根檔案系統,這樣就可以在目標機中直接訪問開發機中生成的檔案了。

為了實現上述想法,首先要解決開發機和目標機之間的通訊問題。qemu提供了四種網路通訊模式:tap、user、sockets和vde,利用user模式可以實現虛擬機器和宿主機之間的通訊且較為簡單易行。在這種通訊模式中,虛擬機器處於10.0.2.*網段中,該網段通過乙個nat伺服器與外界通訊,nat伺服器的位址是10.0.2.2,同時該nat伺服器還提供了dhcp服務,虛擬機器的ip位址從10.0.2.15開始分配。

首先在開發機中安裝並啟動nfs伺服器:

apt-get install nfs-kernel-server

/etc/init.d/nfs-kernel-server start

如果系統中執行了防火牆,最好將其關閉。在nfs服務的配置檔案/etc/exports

中新增:

/    *(rw,no_root_squash,insecure

)將開發機的整個根檔案系統匯出。注意:為了使目標機在nat中能夠連線開發機的nfs服務,需要加上insecure選項。在開發機中重新啟動nfs服務:

/etc/init.d/nfs-kernel-server restart

此外,為了使目標核心能夠支援nfs客戶端,需要開啟如下目標核心選項:

file system

--> network file system

--> nfs client support

然後,在開發機中啟動qemu:

qemu -kernel arch/x86/boot/bzimage -initrd image.cpio.gz \

-net user -net nic,model=pcnet -s

這裡在目標機中啟用了amd pcnet32網絡卡,所以應注意在目標核心中編入對應的網絡卡驅動程式。最後,在目標機中配置網路、掛載nfs檔案系統、切換根檔案系統:

ifconfig eth0 10.0.2.15 up

route add default gw 10.0.2.2

mount -t nfs -o nolock 192.168.0.24:/ /mnt

mount -t proc proc /mnt/proc

mount -t sysfs sysfs /mnt/sysfs

chroot /mnt /bin/bash --login

此時,目標機的根檔案系統就是開發機的根檔案系統,在目標機中可以直接訪問開發機中的檔案了。

**:

qemu 環境搭建

早在2011年的時候,跟當時同事一起討論,做linux系統開發正處於整個linux開發中間層,沒有上層的c c 業務和資料庫的開發經驗,也沒有底層的核心和驅動開發經驗,到底路該如何走 基於對linux系統開發的理解和核心的興趣,認為選擇linux核心開發更適合自己。於是到 上買了塊三星s3c2440...

IDA除錯QEMU修復除錯環境

本篇文章是按照家用路由器裡面的內容來敘述的.在目錄 my file dir605l fw 113.bin.extracted squashfs root 0 下 執行cp which qemu mips 而後執行命令 sudo chroot qemu mips bin boa 注意 書上是有錯誤的,...

ubuntu用qemu除錯linux核心

出於對用虛擬機器 除錯 核心 看是否能對學習核心有比較大的幫助。進行了下驗證 中間 的命令僅作為參考,是使用過程中的一些記錄,檔案命名 路徑名 使用時 作出對應調整 需。wget 解壓 tar xvf linux 3.10.104.tar.xz cd linux 3.10.104 進行配置 make...