在類unix 作業系統 中,驅動 加載 方式一般分為:動态加載和靜态加載,下面分别對其詳細論述。
一、動态加載
動态加載是将驅動子產品加載到核心 中,而不能放入/lib/modules/下。
在2.4核心中,加載驅動指令 為:insmod ,删除子產品為:rmmod;
在2.6以上核心中,除了insmod與rmmod外,加載指令還有modprobe;
insmod與modprobe不同之處:
insmod 絕對路徑/××.o,而modprobe ××即可,不用加.ko或.o字尾,也不用加路徑;最重要的一點是:modprobe同時會加載目前子產品所依賴的其它子產品;
lsmod檢視目前加載到核心中的所有驅動子產品,同時提供其它一些資訊,比如其它子產品是否在使用另一個子產品。
二、靜态加載
(一)概念
在執行make menuconfig指令進行核心配置裁剪時,在視窗中可以選擇是否編譯入核心,還是放入/lib/modules/下相應核心版本目錄中,還是不選。
(二)操作步驟
linux裝置一般分為:字元裝置、塊裝置和網絡 裝置,每種裝置在核心源代碼目錄樹drivers/下都有對應的目錄,其加載方法類似,以下以字元裝置靜态加載為例,假設驅動程式源代碼名為ledc.c,具體操作步驟如下:
第一步:将ledc.c源程式放入核心源碼drivers/char/下;
第二步:修改drivers/char/Config.in檔案,具體修改如下:
按照打開檔案 中的格式添加即可;
在檔案的适當位置(這個位置随便都可以,但這個位置決定其在make menuconfig視窗中所在位置)加入以下任一段代碼:
第三步:編輯配置檔案Kconfig,加入驅動選項,使之在make menuconfig 的時候出現
打開 kernel-2.6.13/drivers/char/Kconfig 檔案,添加
config DEMO_WYK
tristate "DEMO test module"
depends on X86_32
其他版本有:config QQ2440_HELLO_MODULE
tristate "QQ2440/mini2440 Hello Module sample"
depends on ARCH_S3C2410
help
QQ2440 hello module sample
or
tristate 'LedDriver' CONFIG_LEDC
if [ "$CONFIG_LEDC" = "y" ];then
bool ' Support for led on h9200 board' CONFIG_LEDC_CONSOLE
fi
說明:以上代碼使用tristate來定義一個宏,表示此驅動可以直接編譯至核心(用*選擇),也可以編制至/lib/modules/下(用M選擇),或者不編譯(不選)。
bool 'LedDriver' CONFIG_LEDC
if [ "$CONFIG_LEDC" = "y" ];then
bool ' Support for led on h9200 board' CONFIG_LEDC_CONSOLE
fi
說明:以上代碼使用tristate來定義一個宏,表示此驅動隻能直接編譯至核心(用*選擇)或者不編譯(不選),不能編制至/lib/modules/下(用M選擇)。
第四步:修改drivers/char/Makefile檔案
在适當位置加入下面一行代碼:
obj-$(CONFIG_LEDC) += ledc.o
或者在obj-y一行中加入ledc.o,如:
obj-y += ledc.o mem.o 後面不變;
Step5:在kernel-2.6.13目錄下執行make menuconfig
在Device Driver——Character Driver下将QQ2440_HELLO_MODULE選為M,子產品方式,退出儲存設定。
Step6:執行指令 make modules。在char目錄下産生qq2440_hello_module.ko的檔案。傳到開發闆上。
Step7:在超級終端 執行 chmod a+rwx qq2440_hello_module.ko
Step8:加載驅動子產品,執行insmod qq2440_hello_module.ko
顯示:
Hello, QQ2440 module is installed !
Step9:解除安裝驅動子產品,執行rmmod qq2440_hello_module.ko
顯示加載驅動子產品,執行
Good-bye, QQ2440 module was removed!