怎麼搭建學習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調試。
兩類方案比較合適
以下是詳細說明:
- 最好的應該是ARM官方出品的DS-5 + FastModels,但是需要收費,或者試用,或者破解。
- Qemu + GDB Backend的方案:例如Android AOSP中的模擬器target lunch目標
對比:
- 前者支持各種IP Core支持最好,因為這個面向的是買ARM IP的SoC vendor,因此這個的模擬遠勝後者,而且學習者可以通過這個軟體知道ARM Core內部的不同IP IPCore,例如中斷控制器
- 後者免費開源,模擬出來的硬體遠不如前者好。
Fast Models的具體選擇
使用Linaro改進過的內核+OS(Android)和Fast Models原型,省去自己探索與不確定因素。
Qemu中的具體選擇
- 最省心的是Android AOSP中的模擬器,repo 完成後編譯模擬器即可運行,然後再clone 內核代碼即可。
- 最快速簡潔的是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 系統有哪些自殺命令?