畢設是做乙個網路方面的專案,需要自己寫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...