怎麼搭建學習Linux內核的運行、調試環境?

一直從事Linux應用層開發,最近打算全面學習內核的網路子系統。不知道怎麼搭建調試環境,比如如果我修改了內核代碼,我怎麼可以跑起來看效果、調試呢?

貌似可以弄個嵌入式設備,升級到設備上面去跑。但是這個比較複雜,有沒有模擬器之類脫離於硬體設備的方法呢?


正巧,我也是對 Linux 的網路協議棧實現感興趣[1]。

首先,我認為你最好先說明你的日常的開發環境,是 x86 還是 ARM,是 32-bit 還是 64-bit,是普通 server 還是嵌入式。如果你跟我一樣在普通 x86-64 server 上寫 Linux 程序,那麼我有一個獨特的內核學習方法:把相關內核代碼編譯成用戶態程序,然後就像閱讀調試普通單線程程序那樣學習內核的相關實現。各種現成的靜態/動態代碼分析工具都能用上[2],單步跟蹤也很方便,丟包、亂序等情況也容易復現。目前我在 chenshuo/linux-study 大體上把基本的 TCP 代碼跑通了,然後寫了幾篇筆記:

  • Linux 中每個 TCP 連接最少佔用多少內存?
  • Linux 4.4 之後 TCP 三路握手的新流程
  • Linux 4.5/4.6 中對 SO_REUSEPORT 的改進

當然這個辦法初始代價比較大,對於學習硬體平台無關的部分是比較適合的。以前也有人搞過,但是現在好像都沒啥動靜了。

  • Linux Kernel Library
  • NUSE: Network stack in USerspacE (LibOS)
  • User Mode Linux (這個還活著,但是似乎跟 GDB 不是很兼容。)
  • chenshuo/4.4BSD-Lite2 (這個是我搞的,方便《TCP/IP 詳解 第2卷》的讀者閱讀理解源碼)

如果你對內核的其他部分感興趣,可以用 QEMU + GDB 來單步跟蹤內核代碼運行。你可能需要用 busybox 做一個極簡的 img,這樣更容易關注你關心的邏輯。

[1] 陳碩:未來想從事Linux 後台開發,需要學習linux內核嗎?像讀內核源碼。還是學好linux網路編程,C,演算法。學習內核的意義有哪些呢?

[2] 我先是用這個辦法把 BSD 4.4 的 TCP/IP 協議棧移植到了 Linux 用戶態。鏈接:【C1000k 新思路:用戶態 TCP/IP 協議棧】【chenshuo/4.4BSD-Lite2】【TCP/IP Illustrated vol. 2】【三路握手的Call Tree】。


qemu-system-x86_64 -initrd rootfs.cpio -kernel bzImage -append "console=ttyS0 root=/dev/ram oops=panic panic=1" -enable-kvm -monitor /dev/null -m 64M --nographic -smp cores=1,threads=1 -cpu kvm64,+smep

用上面的命令啟動qemu,其中bzImage是kernel映像,rootfs.cpio是根文件的映像。

如果要調試的話,加入參數-gdb tcp::1234 -S, gdb中用target remote :1234連接即可。

MIT-6.828操作系統課程中用來調試內核的也是qemu,可以借鑒下。


Linux Lab —— Linux內核和嵌入式Linux學習環境

專門為題主等同學們設計的,開源,免費,快捷,基於 Docker 和 Qemu,支持 Mac OSX,Linux和Windows,理論支持所有 Qemu 虛擬的開發板,已默認添加 4 大平台 6 款板子,部分支持 Uboot。另外,內建有交叉編譯和調試工具、Buildroot根文件系統支持等。

自帶編譯好的內核和小型根文件系統,可極速體驗:

$ make boot

列出支持的板子,選擇板子,運行、調試和測試超級簡單:

$ make list

$ make BOARD=vexpress-a9

$ make kernel-download

$ make kernel-defconfig

$ make kernel-menuconfig

$ make kernel

$ make boot

$ make debug

$ make test

更多用法見代碼倉庫中的 README.md

項目首頁:

http://tinylab.org/linux-lab

代碼倉庫:

https://github.com/tinyclub/linux-lab.git

進階用法:

http://tinylab.org/cloud-lab

在線體驗:

http://tinylab.cloud:6080/

演示視頻:

http://showdesk.io/7977891c1d24e38dffbea1b8550ffbb8

~~~~~~

有同學在問早期版本 Linux 內核的開發環境,請移步到 Linux 0.11 Lab,http://tinylab.org/linux-0.11-lab

歡迎感興趣的同學加本人微信號(lzufalcon)進 Linux Lab 用戶群。

有志於給 Linux Lab 擴展板子,增加功能的同學也歡迎加入 Linux Lab 開發者群。

對於早期 Linux 內核感興趣的同學,歡迎加入 Linux 考古隊。


可以使用qemu來搭建Linux kernel的開發、調試和驗證環境,非常好用。

可參見我寫過的博文 從零使用qemu模擬器搭建arm運行環境


KVM, VMware


用qemu或者skyeye等純模擬器,都可以直接連GDB調試。


兩類方案比較合適

以下是詳細說明:

  1. 最好的應該是ARM官方出品的DS-5 + FastModels,但是需要收費,或者試用,或者破解。
  2. Qemu + GDB Backend的方案:例如Android AOSP中的模擬器target lunch目標

對比:

  1. 前者支持各種IP Core支持最好,因為這個面向的是買ARM IP的SoC vendor,因此這個的模擬遠勝後者,而且學習者可以通過這個軟體知道ARM Core內部的不同IP IPCore,例如中斷控制器
  2. 後者免費開源,模擬出來的硬體遠不如前者好。

Fast Models的具體選擇

使用Linaro改進過的內核+OS(Android)和Fast Models原型,省去自己探索與不確定因素。

Qemu中的具體選擇

  1. 最省心的是Android AOSP中的模擬器,repo 完成後編譯模擬器即可運行,然後再clone 內核代碼即可。
  2. 最快速簡潔的是Yocto + Qemu + Eclipse,對此又有兩種方法:

結合Yocto Qemu與Eclipse單步調試開發Linux Kernel

Xilinx的PetaLinux SDK中的Qemu,其實是第一種的變種

另外也可以參考我以前寫的水文:

Yocto tips (20): Yocto中qemu模擬器的使用,以zynq Cortex-A9為例

使用Buildroot與Qemu學習ARM linux IIC驅動


使用QEMU可以模擬一個實際的開發板,比如mini2440,可以模擬開發板的各種硬體:CPU、網口、Flash、RAM、I2C等,現在QEMU2.X版本還可以模擬A9系列的開發板,對於研究嵌入式linux內核、u-boot比開發板還方便:使用QEMU搭建u-boot+Linux+NFS嵌入式開發環境視頻課程_共9課時-51CTO學院


記得關注《奔跑吧linux內核》,第6章,提供全球第一個基於O0編譯的單步調試內核,好處多多,驚喜多多


推薦 Eclipse + Qemu ,下面的博客鏈接是我的詳細配置過程

http://blog.csdn.net/aggresss/article/details/76577681

下面兩個鏈接是參考資料

https://wiki.eclipse.org/HowTo_use_the_CDT_to_navigate_Linux_kernel_source

http://events.linuxfoundation.org/sites/events/files/slides/ELCE_2016_Exploring_Linux_Kernel_Source_Code_with_Eclipse_and_QTCreator.pdf


裸機:

安裝Fedora或者Ubuntu

跑qemu虛擬機,然後就可以調試虛擬機內核了

用virt-manager創建虛擬機

然後通過virsh命令啟動gdb-server

就可以愉快的gdb調試內核了

虛擬機

也可以在虛擬機裡面調試虛擬機,打開nested kvm功能,再調試新的虛擬機

沒有在VMware或者virtualbox上試過


我只是安裝了內核的debug信息包,然後用crash去跟蹤內核信息,感覺很方便


推薦閱讀:

在現代的Unix操作系統上執行sudo rm -rf /會發生什麼?
有什麼理由選擇收費的RHEL而不用免費的Centos?
為什麼那麼多「國產」操作系統?
linux kernel有設計和開發文檔嗎?
Linux 系統有哪些自殺命令?

TAG:Linux | Linux開發 | Linux內核 |