linux 2.6 驅動筆記(一)

本文做爲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。

相關文章
相關標籤/搜索