1. 程式人生 > >Linux核心模組編譯

Linux核心模組編譯

Linux核心模組是一種可被動態載入和解除安裝的可執行程式。通過核心模組可以擴充套件核心功能,核心模組通常用於裝置驅動、檔案系統等。如果沒有核心模組,需要向核心新增功能就需要自發程式碼、重新編譯核心、安裝新核心等步驟。

核心空間中不止一個程式試圖訪問驅動程式模組,導致一個核心塊在沒有被呼叫完畢之前又被其他程式呼叫,這稱之炒程式碼的重入。因此在設計驅動模組的資料結構時要考慮資料結構在多執行緒環境下不被其他執行緒破壞,對於共享的資料應該採取加鎖的方法保護。

可以把核心比喻成一個很長的火車,每個車廂就是一個核心模組,核心在執行這個火車就會一直在開動,但是我們想在火車開動的情況下增加新的車廂,這個時候就需要

insmod,意思就是往這個長長的火車車廂增加一個核心模組。

  1. 下載當前版本的Linux原始碼

#uname -a

apt-cache search linux-source 命令對應的linux核心版本

apt-get install linux-source-4.4.0 下載對應的linux核心原始碼

下載的原始碼在  /usr/src/

tar -jxv -f linux-source-4.4.0.tar.bz2 -C /data/weiqifa/

把原始碼解壓到我的使用者目錄下

2、編寫模組的Makefile和核心模組程式碼

ifneq ($(KERNELRELEASE),)  
  
obj-m :=hello.o  
  
else  
KDIR:= /lib/modules/4.4.0-62-generic/build/  
  
all:  
    make -C $(KDIR) M=$(PWD) modules   
clean:  
    rm -f *.ko *.o *.mod.o *.mod.c .symvers  
  
endif


hello.c程式碼

#include <linux/module.h>  
#include <linux/init.h>  
  
MODULE_LICENSE("GPL");  
MODULE_AUTHOR("DAVID");  
MODULE_DESCRIPTION("Hello world module");  
  
static int __init hello_init(void)  
{  
    printk(KERN_ERR "hello world!\n");  
    return 0;  
}  
static void __exit hello_exit(void)  
{  
    printk(KERN_EMERG "hello exit!\n");  
}  
  
module_init(hello_init);  
module_exit(hello_exit); 

3、編譯

編譯後生成如下檔案

4、執行命令

5、日誌列印

         輸入dmesg可以看到核心日誌

喜歡可以關注微信公眾號:嵌入式Linux