在類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窗口中所在位置)加入以下任一段代碼:
?? ?? ??
?? ?? ?? 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 后面不變;
??? OK,經過以上的設置就可以在執行make menuconfig命令后的窗口中的character devices---> 中進行選擇配置了。選擇后重新編譯就ok了。