本文做爲linux 2.6 驅動筆記,記錄環境搭建及linux基本內核模塊編譯加載。linux
環境搭建:shell
硬件:OK6410開發板windows
目標板操做系統:linux 2.6ssh
交叉編譯環境:windows 7 + vmware work station + redhat 9 + arm-gcc-linuxspa
步驟:操作系統
編寫簡單內核模塊,以下code
#include<linux/init.h> #include<linux/module.h> static int hello_init(void){ printk("hello_init"); return 0; } static void hello_exit(void){ printk("hello_exit"); } module_init(hello_init); //加載時調用 modeule_exit(hello_exit);//卸載時調用
編寫makefile(網上現成的模板):blog
KERNELDIR = /home/linux-2.6.36/linux-2.6.36.2-v1.05 //交叉編譯環境中的內核源碼路徑 PWD := $(shell pwd) CC = arm-linux-gcc obj-m := driver01.o //與編譯的.c文件同名 modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules //前面要有tag clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions .PHONY: modules clean
編譯產生driver01.ko,拷貝至目標板(採用SD卡),執行:insmod driver01.ko,控制檯打印「hello_init」。執行lsmod後顯示:ip
備註:ci
1. 「 error: generated/bounds.h: No such file or directory」 編譯錯誤,makefile中的kerneldir是內核源碼的地址,在編譯時用於頭文件的引用。bounds.h是須要linux編譯後生成,所以出現該問題須要make一下linux源碼;
2. "module license 'unspecified' taints kernel" 告警,緣由是內核模塊源碼中未增長「MODULE_LICENSE("GPL");」
3. arm-linux-gcc安裝完後,在redhat linux中經過修改etc/profile增長環境變量,以下:
# Path manipulation if [ `id -u` = 0 ]; then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbin pathmunge /home/arm/usr/local/arm/4.3.2/bin fi
4. 在windows 7下經過ssh客戶端鏈接vmware上的redhat時,IP用的是vmawre的虛擬網卡,而非xp時真實的網口ip。