像你寫C程序須要包含C庫的頭文件那樣,Linux內核編程也須要包含Kernel頭文件,大多的Linux驅動程序須要包含下面三個頭文件:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
其中,init.h 定義了驅動的初始化和退出相關的函數,kernel.h 定義了常常用到的函數原型及宏定義,module.h 定義了內核模塊相關的函數、變量及宏。linux
幾乎每一個linux驅動都有個module_init(與module_exit的定義在Init.h (\include\linux) 中)。驅動的加載就靠它。編程
module_init除了初始化加載以外,還有後期釋放內存的做用。linux kernel中有很大一部分代碼是設備驅動代碼,這些驅動代碼都有初始化和反初始化函數,這些代碼 linux就是這樣作的,對只須要初始化運行一次的函數都加上__init屬性,__init 宏告訴編譯器若是這個模塊被編譯到內核則把這個函數放到(.init.text)段,module_exit的參數卸載時同__init相似,若是驅動被編譯進內核,則__exit宏會忽略清理函數,由於編譯進內核的模塊不須要作清理工做,顯然__init和__exit對動態加載的模塊是無效的,只支持徹底編譯進內核。函數