linux驱动日志格式,( 转)嵌入式Linux驱动Makefile
天氣: 晴朗
心情: 高興
( 轉)嵌入式Linux驅動開發筆記
1.1 ?????? 模塊的編譯
Linux驅動一般以模塊module的形式來加載,首先需要把驅動編譯成模塊的形式。簡單的例子,
Begin of hello.c file
#include
#include
#include
static int __init test_init(void)
{
printk("init module\n");
return 0;
}
static void __exit test_exit(void)
{
printk("exit modules\n");
}
module_init(test_init);
module_exit(test_exit);
Over of hello.c file
Makefile為,
PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-source-2.6.15/
obj-m := test.o
module-objs := test.o
all:
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
clean:
rm *.ko
rm *.o
在test.c和Makefile所在的目錄下運行make,如果看到類似輸出
make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules
make[1]: Entering directory `/usr/src/linux-source-2.6.15'
CC [M]? /home/vmeth/hello.o
Building modules, stage 2.
MODPOST
CC????? /home/vmeth/hello.mod.o
LD [M]? /home/vmeth/hello.ko
make[1]: Leaving directory `/usr/src/linux-source-2.6.15'
一般用下面的Makefile,
# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
mymodule-objs := hello.o
obj-m := hello.o
else
PWD? := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
KERNELRELEASE 是在內核源碼的頂層Makefile中定義的一個變量,在第一次讀取執行此Makefile時,KERNELRELEASE沒有被定義,所以make將讀取執行else之后的內容。
當make的目標為all時,-C $(KDIR) 指明跳轉到內核源碼目錄下讀取那里的Makefile;M=$(PWD) 表明然后返回到當前目錄繼續讀入、執行當前的Makefile。
當從內核源碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句, 指明模塊源碼中各文件的依賴關系,以及要生成的目標模塊名。
每個內核的名字都包含了它的版本號,這也是 uname -r 命令顯示的值。
下面附件中是一個例子,
總結
以上是生活随笔為你收集整理的linux驱动日志格式,( 转)嵌入式Linux驱动Makefile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC 宏常识
- 下一篇: Window 窗口层次关系