Linux設備驅動程序(第三版)之helloWorld模塊

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
參考鏈接

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