Ubuntu18.04+Qemu調試Linux內核實驗記錄

Ubuntu18.04+Qemu調試Linux內核實驗記錄

  1. 實驗環境
    操作系統:Ubuntu18.04
    依賴項安裝:
    sudo apt-get install texinfo
    sudo apt-get install libncurses5-dev
    sudo apt-get install m4
    sudo apt-get install flex
    sudo apt-get install bison
    2.編譯內核
    cd內核源代碼目錄/
    make mrproper //清除編譯過程中產生的所有中間文件
    make clean //清除上一次產生的編譯中間文件
    make menuconfig //圖形化界面,方便選擇一些功能
    //內核編譯選項配置
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

//退出並保存配置
//編譯內核源代碼:make -j2 #-jN會make得更快
//缺少openssl/opensslv.h: No such file or directory
Sudo apt-get install libssl-dev
3.安裝busybox
//下載源代碼
下載地址:https://busybox.net/
//編譯源代碼
cd 源代碼目錄
make clean
make defconfig
make menuconfig
//配置編譯選項
在這裏插入圖片描述
在這裏插入圖片描述

//編譯與安裝
make -j4
sudo make install
#此時可以在內核源代碼目錄中看到生成的_install目錄。通過下面的命令可以驗證busybox是否安裝正確./busybox ls
//生成initrd
首先將上一步生成的_install文件夾複製到其他位置
cd …
mkdir ramdisk
cd ramdisk
cp -r …/內核源代碼目錄/_install/* .
//設置初始化進程init(建立一個軟鏈接,一定不能直接複製過去)
#進入剛剛創建的ramdisk目錄
cd ramdisk
ln -s bin/busybox init
//設定一些程序運行所需要的文件夾
mkdir -pv {bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
//編寫inittab,指定開機需要啓動的所有程序
cd ./etc
vim inittab
// inittab文件的內容如下所示:
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a
//賦予可執行權限
chmod +x inittab
//編寫系統初始化命令
#在ramdisk/etc目錄下
mkdir init.d
cd init.d
vim rcS
// rcS文件的內容
#!/bin/sh
mount proc
mount -o remount,rw /
mount -a
clear
echo “My Tiny Linux Start 😄 …”
//賦予可執行權限
chmod +x rcS
//在rcS腳本中,mount -a 是自動掛載 /etc/fstab 裏面的東西,可以理解爲掛//在文件系統,因此我們還需要編寫 fstab文件來設置我們的文件系統。
cd ramdisk/etc/
vim fstab
// fstab文件內容
// /etc/fstab

proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devtmpfs /dev devtmpfs defaults 0 0
//壓縮生成文件鏡像
cd ramdisk
find . -print0 | cpio --null -ov --format=newc | gzip -9 > …/initramfs.img
//生成的initramfs.img就是我們的根文件系統
//測試根文件系統
#安裝qemu
sudo apt-get install qemu
#測試
qemu-system-x86_64 -kernel Linux內核目錄/arch/x86_64/boot/bzImage -initrd 文件系統目錄/initramfs.img
4.使用Qemu調試Linux內核
#在linux源碼目錄下運行以下指令qemu-system-x86_64 -S -kernel arch/x86_64/boot/bzImage -m 1024

// 如果安裝了最小文件系統,那麼可以使用下面的指令
qemu-system-x86_64 -kernel linux源碼目錄/arch/x86_64/boot/bzImage -initrd …/initramfs.img -smp 2 -S -s -m 1024
qemu-system-x86_64的參數比較多,這裏簡單說下:
-kernel 是指定一個大內核文件,當仁不讓的是bzImage。
-initrd 是指定一個 initrd.img文件,這個文件就是我們使用busybox生成的initramfs.img。
-smp 可以從名字猜想,它是給qemu指定幾個處理器,或者是幾個線程<嗯,大概意思就thread吧>。
-gdb則是啓動qemu的內嵌gdbserver,監聽的是本地tcp端口1234—如果這樣寫: -gdb tcp:192.168.1.100:1234 ,似乎也是沒問題的。
-S 就是掛起gdbserver,讓gdb remote connect it。
-s 默認使用1234端口進行遠程調試,和-gdb tcp::1234類似。
-m 2048 指定內存大小爲2048M
(注意,在自己的實驗中不能使用-s,否則內核的啓動過程會卡死)
qemu-system-x86_64 -kernel …/Linux_Source_Code/linux-4.14.162/arch/x86_64/boot/bzImage -initrd initramfs.img -smp 2 -S -m 1024
//接下來會出現一個黑色的界面,ctrl+alt+1 與 ctrl+alt+2可以切換,前者是屏幕輸出,後者是qemu控制檯,運行起來後是黑屏,我們要切換到控制檯,用鼠標點擊窗口,然後ctrl+alt+2,如下圖所示輸入,然後回車,ctrl+alt+1切換回來,ctrl+alt切出鼠標。
在這裏插入圖片描述

gdbserver tcp::1234 (等待遠端gdb登入)
//在另一個終端中,進入Linux源代碼目錄
gdb vmlinux
在這裏插入圖片描述

target remote localhost:1234
在這裏插入圖片描述

//設置斷點
b start_kernel
//設置硬件斷點
hb start_kernel
在這裏插入圖片描述

//運行代碼至斷點處
c/continue
在這裏插入圖片描述

//出現如下圖所示的問題,無法調試內核
在這裏插入圖片描述

//解決方法,在使用Qemu進行調試時添加nokaslr選項
qemu-system-x86_64 -kernel …/Linux_Source_Code/linux-4.14.162/arch/x86_64/boot/bzImage -initrd initramfs.img -smp 2 -S -m 1024 -append nokaslr
在這裏插入圖片描述

#繼續運行,系統啓動
在這裏插入圖片描述

5.參考資料
https://blog.csdn.net/u012313382/article/details/93381046
https://blog.csdn.net/jasonLee_lijiaqi/article/details/80967912
https://busybox.net/
https://www.zhihu.com/question/270476360

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章