Linux核心動態載入自定義模組

2021-10-01 16:27:14 字數 2102 閱讀 1180

畢設是做乙個網路方面的專案,需要自己寫netfilter模組,今天研究了一下午怎麼往linux核心上載入自定義模組,遇到了很多問題,記錄一下心得。簡單起見,以乙個helloworld模組為例來說。核心是3.10版本的。

#include

#include

static

inthello_init

(void

)static

void

hello_exit

(void

)module_init

(hello_init)

;module_exit

(hello_exit)

;

這裡有幾個需要注意的地方:

① hello_init函式返回值需要寫成int型別,不然make時會報乙個警告

② 函式就算沒有引數也要寫上void,不然會報警告function declaration isn』t a prototype

③ 理論上最後要加乙個module_author和module_license,不然核心會報乙個警告說核心被汙染= =

要學習makefile檔案編寫規則,推薦乙個教程跟我一起寫makefile

本例中makefile檔案如下:

ifneq

($(kernelrelease),)

obj-m :

= hello.o

else

kdir :

=/usr/src/kernels/

3.10.0-

1062.9

.1.el7.x86_64

pwd :

=/root

all:

make -c $(kdir) m=$(pwd) modules

clean:

rm -f *

.ko *

.o *

.mod.o *mod.c *

.symvers *

.order

endif

先引用一段話

kernelrelease是在核心原始碼的頂層makefile中定義的乙個變數,在第一次讀取執行此makefile時,kernelrelease沒有被定義,所以make將讀取執行else之後的內容,如果make的目標是clean,直接執行clean操作,然後結束。當make的目標為all時,-c $(kdir)指明跳轉到核心原始碼目錄下讀取那裡的makefile;m=$(pwd) 表明然後返回到當前目錄繼續讀入、執行當前的makefile。當從核心原始碼目錄返回時,kernelrelease已被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句,指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。

ifneq是if not equal,意思就是判斷kernelrelease是否為null,obj-m代表將hello.o載入為模組,如果換成obj-y就是載入進核心。kdir是你自己電腦核心原始碼目錄,pwd是hello.c和makefile檔案所在目錄(我的是/root)。注意,makefile對縮排和空格很敏感,乙個不小心就會報錯,而且這種錯很難發現。

在hello.c和makefile檔案路徑下執行make命令,成功後如下圖:

此時目錄下的檔案:

如果make過程中有報錯stack-protector enabled but compiler support broken,請先安裝gcc。

載入:insmod hello.ko (install module)

解除安裝:rmmod hello (remove module)

printk函式輸出的資訊在/var/log/messages中,載入模組後,用vim開啟該檔案即可看到自定義的輸出訊息:

解除安裝後的輸出訊息:

至此,小功告成,過段時間寫自定義netfilter模組。

iOS核心動畫之CALayer 自定義層

本文目錄 自定義層,其實就是在層上繪圖,一共有2種方法,下面詳細介紹一下。回到頂部 方法描述 建立乙個calayer的子類,然後覆蓋drawincontext 方法,使用quartz2d api進行繪圖 pragma mark 繪製乙個實心三角形 4 void drawincontext cgcon...

python from import 自定義模組

from douban250.items import douban250item python import 自定義模組 1 主程式與模組程式在同一目錄下 如下面程式結構 src mod1.py test1.py 若在程式test1.py中匯入模組mod1,則直接使用 import mod1或fr...

Flex實現自定義ToolTip 動態載入

flex中實現自定義tooltip,也很簡單,只要按如下三個步驟即可 1.容器類實現mx.core.itooltip介面,如下 2.要實現動態載入tooltip,需要設定tooltip載體控制項的事件,例如 var tmpdisplay displayobject this.getchildbyna...