1. 建立內核樹
下載內核源碼
在裝載內核之前,需要在自己的文件系統中建立內核樹。在命令行中輸入#uname -a
命令查看本機的內核版本(4.4),然後到kernel.org上下載對應的版本的內核源碼。內核源碼的主次設備號與本機內核版本保持一致。將源碼下載到本地目錄/home/wlf/linux/
下。
解壓
#tar -xzvf linux-4.4.176.tar.xz
,解壓後生成linux-4.4.176
目錄。
配置
進入目錄linux-4.4.176
,將當前系統的.config
文件拷貝到本目錄下:
#cp /boot/config-4.4-142-generic ./.config
編譯內核
#make
//(時間較長,1-2個小時,make命令實際分爲兩個階段:stage1,stage2,第一個階段生成了內核鏡像文件bzImage,第二個階段編譯模塊,相當於make = make bzImage + make modules).
安裝模塊
#make modules_install
新內核啓動配置
將生成的內核文件拷貝至系統啓動目錄:#cp /home/wlf/linux/linux-4.4.176/arch/x86/boot/bzImage /boot/vmlinuz-4.4.176
;
製作initrd鏡像文件:mkinitramfs 4.4.176 -o initrd.img-4.4.176
(本機爲ubuntu系統,不同操作系統該命令可能不同,執行後會在/boot/目錄下生成initrd.img-4.4.176文件)
升級grub:#updates grub2
,該命令會自動修改grub配置文件
啓動新內核
重啓操作系統,在grub頁面會出現新安裝的內核選項,啓動即可,若啓動失敗,還可以在grub中選擇之前的內核啓動。
2. 測試模塊
前面都是準備工作,下面開始編寫模塊。
1.hello.c:
在合適的地方新建/deviceDriver/helloWolrd
目錄,在目錄下創建文件:hello.c
#include<linux/init.h> //初始換函數
#include<linux/kernel.h> //內核頭文件
#include<linux/module.h> //模塊的頭文件
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello,world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye,Cruel world \n");
}
module_init(hello_init);
module_exit(hello_exit);
2.Makefile:
再創建Makefile文件:
obj-m := hello.o
KVERSION = $(shell uname -r)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
3.執行 #make
會在目錄下生成hello.ko,這就是我們得到的模塊。
4.安裝模塊:sudo insmod hello.ko
5.查看打印信息
#tail -f /var/log/kern.log
6.卸載模塊
#sodu rmmod hello.ko
參考鏈接