最近項目也和linux kernel技術有關,調試內核和內核模塊、修改內核源碼,是學習內核的重要技術手段之一。應用這些技術時,都有一本基本的要求,那就是編譯內核。因此,在分析內核調試技術之前,本隨筆給出內核的編譯准備工作與具體實現過程。
開發環境
Ubuntu20.04
系統自帶的內核版本:5.4.0-42-generic
kernel編譯前的准備
在編譯內核之前,有些准備工作需要進行。首先,就是從內核網站https://mirrors.edge.kernel.org/pub/linux/kernel/,下載好源碼。這之前,需要確定下載哪個版本的內核源碼。因為我目前的開發環境是ubuntu 20.04,內核版本為5.4.0。而實驗選擇的下載版本,就是5.4.0。因為這樣編譯過程不容易出現bug(理論上其他內核版本也可以,具體問題后面分析)。
接着,使用sudo apt-get install安裝一些必要的軟件。在進行配置時,會執行命令“make menuconfig”,它需要libncurses5-dev、flex、bison等軟件。ncurses庫可用於管理字符終端界面,而bison和flex是生成詞法分析器的工具。除此之外,還需要安裝好kernel-package、libssl-dev。
最后一項准備工作,就是禁止內核地址隨機化。出於安全考慮,內核支持ASLR (Address Space Layout Randomization),即地址隨機化。但是隨機化在增加安全保障的同時,也給內核開發帶來了一些麻煩,比如內核模塊、函數等相關地址不方便直接確定。在后面的kgdb開發中,不管是開發機,還是目標機,都需要禁止內核地址隨機化。禁止的方法,即修改grub配置文件。具體步驟如下:
打開/etc/default/grub文件;
在該文件中,找到GRUB_CMDLINE_LINUX,修改其為:GRUB_CMDLINE_LINUX="nokaslr";
執行命令update-grub,以更新grub配置文件等;
最后,重啟系統即可。
上述步驟實質就是設置了內核命令行參數nokaslr,其意為禁止內核ASLR。一般來說,單純編譯內核是不需要這一步驟的。但是,在后面的項目中,都需要禁止內核地址隨機化。因此,將其放在了編譯前的准備工作中。