makefile編譯模塊
第一步:准備源代碼
首先我們還是要來編寫一個符合linux格式的模塊文件,這樣我們才能開始我們的模塊編譯。假設我們有一個源文件mymod.c。它的源碼如下:
mymoles.c
1. #include <linux/mole.h> /* 引入與模塊相關的宏 */
2. #include <linux/init.h> /* 引入mole_init() mole_exit()函數 */
3. #include <linux/moleparam.h> /* 引入mole_param() */
4
5. MODULE_AUTHOR("Yu Qiang");
6. MODULE_LICENSE("GPL");
7
8. static int nbr = 10;
9. mole_param(nbr, int, S_IRUGO);
10.
11. static int __init yuer_init(void)
12.{
13. int i;
14. for(i=0; i<nbr; i++)
15. {
16. printk(KERN_ALERT "Hello, How are you. %d/n", i);
17. }
18. return 0;
19.}
20.
21.static void __exit yuer_exit(void)
22.{
23. printk(KERN_ALERT"I come from yuer's mole, I have been unlad./n");
24.}
25.
26. mole_init(yuer_init);
27. mole_exit(yuer_exit);
我們的源文件就准備的差不多了,這就是一個linux下的模塊的基本結構。第9行是導出我們的符號變數nbr。這樣在你載入這個模塊的時候可以動態修改這個變數的值。稍後將演示。yuer_init()函數將在模塊載入的時候運行,通過輸出的結果可以看到我們的模塊是否載入成功。
第二步:編寫Makefile文件
首先還是來看看我們Makefile的源文件,然後我們再來解釋;
Makefile
obj-m := moles.o #要生成的模塊名
moles-objs:= mymod.o #生成這個模塊名所需要的目標文件
KDIR := /lib/moles/`uname -r`/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions
ARM平台
Makefile
obj-m += mymod.o
KDIR := /home/workspace2/kernel/linux-2.6.25 #如果是用於arm平台,則內核路徑為arm內核的路徑
PWD = $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) moles
clean:
rm -rf *.o
在arm板上插入是
insmod mymod
如果出現以下錯誤
insmod: chdir(/lib/moles): No such file or directory
則運行
mkdir /lib/moles/2.6.25 (與arm內核版本相同)
並將mymod.ko文件復制到該目錄下
cp mymod.ko /lib/moles/2.6.25
然後再執行 (insmod 只在/lib/moles/2.6.25目錄下查找相關驅動模塊)
insmod mymod
現在我來說明一下這個Makefile。請記住是大寫的Makefile而不是小寫的makefile;
obj-m :這個變數是指定你要聲稱哪些模塊模塊的格式為 obj-m := <模塊名>.o
moles-objs :這個變數是說明聲稱模塊moles需要的目標文件 格式要求 <模塊名>-objs := <目標文件>
切記:模塊的名字不能取與目標文件相同的名字。如在這里模塊名不能取成 mymod;
KDIR :這是我們正在運行的操作系統內核編譯目錄。也就是編譯模塊需要的環境
M= :指定我們源文件的位置
PWD :這是當前工作路徑$(shell )是make的一個內置函數。用來執行shell命令。
第三步:編譯模塊
現在我們已經准備好了我們所需要的源文件和相應的Makefile。我們現在就可以編譯了。在終端進入源文件目錄輸入make
運行結果:
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'
CC [M] /home/yuqiang/桌面/mymole/mymoles.o
LD [M] /home/yuqiang/桌面/mymole/moles.o
Building moles, stage 2.
MODPOST 1 moles
CC /home/yuqiang/桌面/mymole/moles.mod.o
LD [M] /home/yuqiang/桌面/mymole/moles.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'
第四步:載入/卸載我們的模塊
從上面的編譯中我可以看到。已經有一個moles.ko生成了。這就是我們的模塊了。現在我們就可以來載入了。
首先在終端輸入:sudo insmod moles.ko
現在我們來看看我們的模塊載入成功沒有呢?
在終端輸入:dmesg | tail -12 這是查看內核輸出信息的意思。tail -12 顯示最後12條;
顯示結果如下:
[17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0
[18046.790019] usb 5-8: USB disconnect, address 9
[19934.224812] Hello, How are you. 0
[19934.224817] Hello, How are you. 1
[19934.224818] Hello, How are you. 2
[19934.224820] Hello, How are you. 3
[19934.224821] Hello, How are you. 4
[19934.224822] Hello, How are you. 5
[19934.224824] Hello, How are you. 6
[19934.224825] Hello, How are you. 7
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
看到了吧。我們的模塊的初始化函數yuer_init();已經成功運行了。說明我們的模塊已經載入成功;
現在我們再來卸載模塊試試看。
在終端輸入:sudo rmmod moles
在終端輸入:dmesg | tail -3
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
[20412.046932] I come from yuer's mole, I have been unlad.
可以從列印的信息中看到,我們的模塊的退出函數已經被執行了。說明我們的模塊已經被成功的卸載了。到目前位置我們就已經算是對模塊的編譯到編譯運行算是有了一個整體上的認識了。對於以後深入的學習還是應該有點幫助的。下面我們將在看看於模塊相關的一些簡單的操作。
第五步:載入模塊時傳遞參數
在終端輸入:sudo insmod mole_name.ko nbr=4
在終端輸入:dmesg | tail -6
顯示結果如下:
[20800.655694] Hello, How are you. 9
[21318.675593] I come from onefile mole, I have been unlad.
[21334.425373] Hello, How are you. 0
[21334.425378] Hello, How are you. 1
[21334.425380] Hello, How are you. 2
[21334.425381] Hello, How are you. 3
這樣我們就可以看到在模塊載入的時候動態設置了我們的一個變數。初始化函數中的循環只執行了4次。
可能你會問我怎麼知道一個模塊可以設置那些變數呢。當然,你可以先不設變數載入一次。然後可以在終端輸入ls /sys/mole/<moles_name>/parameters/來查看。在這里我們是這樣輸入的
在終端輸入:ls /sys/moedle/moles/parameters/
顯示結果:
nbr
如果我們的模塊載入成功了。最後我們還可以通過modinfo來查看我們的模塊信息。如下
在終端輸入:sudo modinfo moles.ko
顯示結果:
filename: moles.ko
license: GPL
author: Yu Qiang
srcversion: 20E9C3C4E02D130E6E92533
depends:
vermagic: 2.6.24-24-generic SMP mod_unload 586
parm: nbr:int
❷ 編譯內核模塊的makefile中的,是什麼意思
Makefile:分布在 Linux 內核源代碼根目錄及各層目錄中,定義 Linux 內核的編譯規則;
建議同時看一下kconfig這兩個在一起配置
❸ 編譯內核模塊的makefile中的,是什麼意思
在編譯內核模塊時,
如有Makefile文件如下:
ifneq ($(KERNELRELEASE),)
param-objs := file1.o file2.o
obj-m := param.oelse
KDIR := /lib/moles/2.6.18-53.el5/buildall:
make -C $(KDIR) M=$(PWD) molesclean:
rm -f *.ko *.o *.mod.o *.mod.c *.symversendif
KERNELRELEASE是在內核源碼的頂層Makefile中定義的一個變數,在第一次讀取執行此Makefile時,KERNELRELEASE沒有被定義,所以make將讀取執行else之後的內容,如果make的目標是clean,直接執行clean操作,然後結束。當make的目標為all時,-C $(KDIR)指明跳轉到內核源碼目錄下讀取那裡的Makefile;M=$(PWD) 表明然後返回到當前目錄繼續讀入、執行當前的Makefile。當從內核源碼目錄返回時,KERNELRELEASE已被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句,指明模塊源碼中各文件的依賴關系,以及要生成的目標模塊名。param-objs
:= file1.o file2.o 表示param.o由file1.o與file2.o 連接生成,obj-m := param.o表示編譯連接後將生成param.o模塊。
❹ 不修改Linux內核文件,直接用makefile編譯驅動,是不是要先把內核編譯一遍
不需要重新編譯內核。需要重新製作文件系統,如果你的文件系統是nfs掛載的,那麼你只需要將
micro2440_leds.ko復制過去,然後insmod進去。
❺ linux如何編寫並使用makefile
1、先寫Makefile編譯出***.ko文件
模板如下,保存到命名為Makefile文件里,放到你代碼的同級目錄下
TARGET=my_proc.ko
LINUXDIR=/lib/moles/$(shell uname -r)/build
PWD=$(shell pwd)
obj-m :=
obj-m += my_proc.o
all: $(TARGET)
$(TARGET): $(OBJS)
make -C $(LINUXDIR) SUBDIRS=$(PWD) moles
clean:
rm -f moles.order Mole.symvers $(TARGET) *.mod.c *.o
rm -rf .tmp_versions .mod* Mole.markers
2、make
3、root許可權下用命令插入模塊
insmod my_proc.ko
4、可以用你寫的應用程序打開、操作模塊了
5、查看模塊命令
lsmod
cat /proc/moles
modinfo my_proc.ko
6、root下卸載模塊
rmmod
❻ 如何編寫makefile
你先用gcc把它給編譯出來。然後再想用makefile
gcc最一般的用法就是:
gcc -o 要生成的可執行文件名 源代碼文件名
如:gcc -o hello.x hello.c
如果一些頭文件要指明的話,可以這樣:
gcc -o hello.x -I頭文件所在的文件夾 -l一些庫名 hello.c
最通常,我們用到一些數學庫。gcc -o hello.x -lm hello.c
makefile的話,你可以基於上述的語句進行修改:建議你看點資料,或一些典型的例子。但是注意的是規則那一行,得用Tab鍵打頭。
hello.x : hello.o
gcc -o hello.x hello.o (這一行,得用Tab打頭)
hello.o : hello.c 頭文件
gcc -c hello.o hello.c -I頭文件所在目錄 -lm (這一行,得用Tab打頭)
❼ 編譯內核模塊的Makefile中的($(KERNELRELEASE),)是什麼意思
在編譯內核模塊時, 如有Makefile文件如下: ifneq ($(KERNELRELEASE),) param-objs := file1.o file2.o obj-m := param.oelse KDIR := /lib/moles/2.6.18-53.el5/buildall: make -C $(KDIR) M=$(PWD) molesclean: rm -f *.ko *.o *.mod.o *.mod.c *.symversendif KERNELRELEASE是在內核源碼的頂層Makefile中定義的一個變數,在第一次讀取執行此Makefile時,KERNELRELEASE沒有被定義,所以make將讀取執行else之後的內容,如果make的目標是clean,直接執行clean操作,然後結束。當make的目標為all時,-C $(KDIR)指明跳轉到內核源碼目錄下讀取那裡的Makefile;M=$(PWD) 表明然後返回到當前目錄繼續讀入、執行當前的Makefile。當從內核源碼目錄返回時,KERNELRELEASE已被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句,指明模塊源碼中各文件的依賴關系,以及要生成的目標模塊名。param-objs := file1.o file2.o 表示param.o由file1.o與file2.o 連接生成,obj-m := param.o表示編譯連接後將生成param.o模塊。
❽ 驅動程序的makefile怎麼寫啊,要在arm上運行的,編譯成內核模塊。
將 KDIR := /lib/moles/2.6.18-53.el5/build
直接指向你的Linux源碼(mini2440改好的)所在的文件夾,再指定對ARM平台編譯即可。注意這個Linux版本要與你ARM上跑的要一致,可在超級終端下用uname -r查看。
比如說你查看的是 2.6.32.2-FriendlyARM,那你只要改兩句:
KDIR := /。。。。。。/Linux-2.6.32.2/
all:
make -C $(KDIR) M=$(PWD) moles ARCH=arm CROSS_COMPILE=arm-linux-
不過之前我先編譯了內核,然後編譯模塊一次成功,不知道有影響么,共同學習吧。(*^__^*)
❾ c語言 怎麼makefile
my_run_filename: main.o set1.o set2.o set3.o
gcc -o my_run_filename main.o set1.o set2.o set3.o
main.o: main.c
gcc -c main.c
set1.o: set1.c
gcc - c set1.c
set2.o: set2.c
gcc -c set2.c
set3.o:set3.c
gcc -c set3.c
雖然我以前也使用過 make 命令對 makefile 文件進行多個源文件進行編譯、鏈接,但是由於我已經很多年不編寫 C 語言程序了,所以也不敢說我寫的就完全正確。但是該 makefile的基本思路我可以給你解釋一下:
my_run_filename: main.o set1.o set2.o set3.o
gcc -o my_run_filename main.o set1.o set2.o set3.o
my_run_filename 是最終生成的可執行程序名,它依賴於四個中間文件(以 *.o 為結尾):main.o set1.o set2.o set3.o
生成該最終可執行的程序名的命令是:gcc -o my_run_filename main.o set1.o set2.o set3.o
main.o: main.c
gcc -c main.c
main.o 這個中間文件依賴於 main.c 源程序,其中:gcc -c main.c 代表只編譯、不鏈接。
gcc 的 -c 選項表示只產生 main.o 文件,等待所有模塊單獨編譯通過了之後,再和別的一起進行鏈接。
其它 set1、set2、set3 同理。
雖然我知道 makefile 的大致思路,但是給我印象最深的就是:make 工具 對 makefile 文本文件的書寫規則是相當苛刻的,你可能還需要花費較多的時間進行 make 調試。