linux驅動部分:交叉編譯驅動模塊&模塊驅動的相關操作&Makefile講解


根據下面的提醒,在自己電腦是的情況是:
b1、模塊整個操作流程
(1)加載模塊:insmod globalfifo_zs_fzs.ko

(2)查看模塊是否被加載:lsmod

(3)查看設備號:cat /proc/devices

(4)創建設備節點:mknod /dev/globalfifo_zs_fzs c 250 0    //c 代表字符型設備

(5)啓動後臺進程(主要是&放在最後即可):cat /dev/globalfifo_zs_fzs&

(6)向設備輸入內容(主要是>):echo 'I love Mywife'> /dev/globalfifo_zs_fzs 

(7)讀取設備內容:cat /dev/globalfifo_zs_fzs

(8)如果無後臺,則刪除設備模塊:rmmod globalfifo_zs_fzs.ko

(9)刪除設備節點:輸入:rm -rf /dev/globalfifo_zs_fzs     刪除 /dev/目錄下的 globalfifo_zs_fzs

(10)如果這裏啓動了後臺程序,那麼直接刪除會提示有程序in used,因此必須先把該後臺進程關閉,ps -lax查看進程,kill -9 pid關閉該進程,rmmod globalfifo_zs_fzs.ko再刪除設備模塊即可,雖然rmmod可以刪除設備,但是設備節點/dev/globalfifo_zs_fzs仍然存在,需要進一步刪除設備節點。

(11)編譯出自己更新的驅動模塊
root@ubuntu:/home/xuyuefei/Linux學習資料/Linux內核移植/opt/EmbedSky/linux-2.6.30
.4# make SUBDIR=drivers/char/ modules

(12)編譯模塊安裝內核模塊
make modules編譯內核模塊;make modules_install安裝內核模塊;!!!將編譯好的內核模塊copy到/lib/modules下,如:
cp /lib/modules/2.6.30.4-EmbedSky -rf ./lib/modules/
你會發現,在make modules和modules_install後,會在你電腦上的/lib/modules多出了ARM對應的linux的版本號即2.6.30


//==================
Makefile的說明

ifneq ($(KERNELRELEASE),)    

obj-m :=Helloworld.o   #這一行決定了內核模塊的名字,Helloworld.o修改爲所需的內核模塊名字
#如果有多個文件這裏再加一行,如下,有兩個.c文件:main.o和add.o
#Helloworld-objs :=main.o add.o  
 
else

#KDIR :=/lib/modules/2.6.32-38-generic/build      for computer
KDIR:=/lib/modules/2.6.30.4-EmbedSky/build    
#for TQ2440

all:
        make -C $(KDIR) M=$(PWD) modules 
;-C是使用KDIR中的makefile來編譯;M表示內核模塊代碼和Makefile在哪裏,PWD表示當前目錄;

clean:
        rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif


代碼部分:

MODULE_LICENSE("GPL");    //宏MODULE_LICENSE來指定遵守的協議GPL:開源的
MODULE_AUTHOR("David Xie"); //模塊作者
MODULE_DESCRIPTION("Hello World Module");//模塊描述
MODULE_ALIAS("a simplest module");//模塊別名




以下是參考的原文:http://bbs.21ic.com/blog-517057-73809.html

首先分析一下hello模塊在電腦上的makefile
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR)  M=$(PWD) modules
clean:
        rm -rf *.o *.mod.c *.mod.o *.ko
endif
如上篇日誌所說,make的時候是要進入兩個文件夾的,此makefile其實等效於下邊一條指令:
make -C /lib/modules/2.6.27.5-41.fc9.i686/build  M=/home/work/driver/other modules(只適用於我這裏)
前邊一個目錄具體是怎麼回事我不清楚,反正要用到其下的Makefile,然後回到hello.c所在目錄。
顯然,這個目錄是電腦內核的,肯定與硬件有關,我們要編譯開發板上的模塊,就得弄一個開發板內核一致的相關文件,查看/lib/modules目錄下邊,並無開發板內核2.6.12相關字樣,看來得自己想辦法弄一個,百度許久,發現果有其事,
你的KDIR也要修改,你係統要生成你arm內核的庫文件,在內核原代碼中使用make modules_install就會在lib/modules下生你arm版的內核文件
在把KDIR指向那個文件就可以了 ”,於是回到編譯內核鏡像那個文件夾,sudo make modules_install,結果就在/lib/modules裏發現了2.6.12-h1940目錄,cd一看,果然有build文件夾。
好了,回到hello文件目錄,修改Makefile文件,
KERNELDIR:=/lib/modules/$(shell uname -r)/build修改爲KERNELDIR=/lib/modules/2.6.12-h1940
/build.再make。生成了hello.ko文件,掛載到開發板上,insmod,在lsmod,發現有了hello.

還有個問題,既然在開發板上執行,就應該使用arm-linux-gcc啊,爲什麼不用設置呢?其實你打開/lib/modules/2.6.12-h1940/build
裏的Makefile一看就知道了,裏邊有這麼兩行:
ARCH        := arm
CROSS_COMPILE    := /usr/local/arm/3.4.1/bin/arm-linux-
已經設置了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章