準備: linux
一、英語-是工具 shell
二、電路原理圖-補充「數電」的知識 windows
三、閱讀內核代碼的能力 函數
linux:vi+ctags+cscope 工具
windows:source insight 測試
驅動開發的步驟 ui
I、編輯 .net
模塊的組成: 日誌
一、許可證的聲明,許可證一般使用GPL協議,若是不聲明許可證內核會產生「抱怨」信息,同時內核中的一些遵循GPL協議的功能函數將會沒法使用,形成驅動功能受限。 ip
二、加載函數,初始化模塊,在使用insmod加載驅動模塊時自動調用,該函數必須聲明爲int init_module(void),insmod調用時會自動加載這個函數。
三、卸載函數,恢復函數,在使用rmmod卸載驅動模塊時會自動調用,函數必須聲明爲void cleanup_module(void),rmmod會自動調用這個函數。
完整示例代碼:
hello.c
/**
* 驅動示例程序
* 實現驅動的加載和卸載
*/
//引入相應的頭文件,內核和模塊的頭文件
#include <linux/kernel.h>
#include <linux/module.h>
//聲明許可證信息,也能夠使用這個來聲明許可證
//MODULE_LICENSE("Dual BSD/GPL")
//這表示支持BSD和GPL兩種協議
MOUDLE_LICENSE("GPL");
//insmod自動加載的函數,必須如此聲明
int init_module(void)
{
//內核中打印信息,須要使用printk函數
printk("Hello world!!!");
return 0;
}
//rmmod自動調用的函數,必須如此聲明
void cleanup_module(void)
{
printk("goodbey!!!");
}
保存
II、編譯
使用內核的編譯文件
一、拷貝代碼到內核文件中;
二、修改對應的Kconfig/Makefile文件
三、使用make menuconfig命令選中對應的菜單項,<*>表示編譯進內核,<M>表示編譯成模塊。
四、編譯
make zImage
make modules
前者編譯內核,後者編譯模塊,編譯完成後生成相應的xxx.ko文件。
外部模塊的編譯,上面的方法必需要到內核的源文件中修改Kconfig和Makefile,實際操做中比較複雜,一般咱們會採用這種編譯方法。
使用內核文檔查看編譯的方法,進入Linux內核目錄下的Documentation
使用命令make –C <path-to-kernel> M=`pwd`命令進行編譯,該命令的使用依賴於內核源碼樹,必須針對特定的硬件平臺,而且有編譯過的內核。
其中make -C /lib/modules/3.2.0-29-generic-pae/build M=`pwd`,使用該命令提示錯誤,是由於在當前目錄中缺乏Makefile文件,如今創建Makefile文件輸入如下代碼:
obj-m += hello.o
保存再次編譯
編譯經過。
咱們還能夠經過一個通用的Makefile文件來完成這個步驟
代碼以下:
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
clean:
rm -rvf *.o *.ko *.mod.c module* Module*
.PHONY:modules clean
else
#修改hello.o文件爲本身須要的文件便可
obj-m += hello.o
endif
編譯生成hello.ko模塊
III、測試
一、插入模塊
sudo insmod hello.ko
當前的終端並無顯示輸出的信息,這是由於終端默認會屏蔽掉全部的內核信息,解決方法有:
一、切入物理終端
二、使用dmesg顯示當前的日誌信息
三、vi /var/log/messages顯示日誌信息
二、lsmod列出當前系統動態加載的模塊
三、rmmod hello 卸載模塊,成功卸載的前提是存在/lib/modules/$(shell uname -r)/build目錄
四、modinfo顯示模塊的信息
modinfo hello.ko顯示以下信息:
五、modprobe 模塊名-按依賴關係加載全部的模塊,使用很少。