linux驅動部分:交叉編譯驅動模組&模組驅動的相關操作&Makefile講解
阿新 • • 發佈:2019-01-06
根據下面的提醒,在自己電腦是的情況是:
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)編譯出自己更新的驅動模組如上篇日誌所說,make的時候是要進入兩個資料夾的,此makefile其實等效於下邊一條指令:[email protected]:/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 -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-已經設定了。