from http://blog.chinaunix.net/uid-22834118-id-3403242.html
2012.11
這里只是概要地描述編寫驅(qū)動的基本步驟,且不會涉及到具體操作或復(fù)雜的編程。
要成功編譯及安裝內(nèi)核模塊,需做好以下幾方面事情:
1 安裝編譯工具。(具體安裝不是本文關(guān)心內(nèi)容)
2 下載內(nèi)核源碼,并配置構(gòu)造內(nèi)核樹;內(nèi)核版本最好跟要加載模塊的系統(tǒng)一致,如不一致,
則可能導(dǎo)致在加載模塊失敗,這時需強(qiáng)制加載。(具體配置設(shè)置及加載不是本文關(guān)心內(nèi)容)
源碼可到
www.kernel.org站上下載。
3 要加載模塊的系統(tǒng)需支持模塊加載功能,否則無法加載驅(qū)動模塊。該功能可在配置系統(tǒng)內(nèi)核時
選中,如圖所示:
該配置基于linux-3.2.1內(nèi)核
4 編寫驅(qū)動程序
demo.zip 當(dāng)編譯環(huán)境搭建好后,接下來就是編寫程序。下面以一個簡單的示例"demo.c"來演示如何編寫一個
最簡單的驅(qū)動程序,當(dāng)然這個驅(qū)動程序除了演示之外別無他用。
- #include <linux/init.h>
- #include <linux/module.h>
-
- MODULE_LICENSE("Dual BSD/GPL"); /* 申明模塊使用的協(xié)議 */
- MODULE_AUTHOR("Kozo"); /* 申明模塊作者 */
- MODULE_DESCRIPTION("It's a demo module"); /* 描述驅(qū)動模塊 */
-
- static __init int demo_init(void)
- {
- printk(KERN_INFO"demo init\n");
- return 0;
- }
- static __exit void demo_exit(void)
- {
- printk(KERN_INFO"demo exit\n");
- }
-
- module_init(demo_init); /* 聲明加載函數(shù) */
- module_exit(demo_exit); /* 聲明卸載函數(shù)*/
5 編寫Makefile文件
Makefile代碼如下:
- # DEBUG = y
-
- ifeq ($(DEBUG),y)
- DEBFLAGS = -O -g #-D"macro of your module"
- else
- DEBFLAGS = -O2
- endif
-
- EXTRA_CFLAGS += $(DEBFLAGS)
- #EXTRA_CFLAGS += -I"the direction of header file"
-
- ifneq ($(KERNELRELEASE),)
- obj-m = demo.o
- else
- KERNELDIR ?= /usr/src/kernels/$(shell uname -r)/
- PWD := $(shell pwd)
- default:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- endif
-
- clean:
- rm -rf *.o *.depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers *.ko.unsigned
6 編譯模塊
注意:demo.c與Makefile應(yīng)在同一目錄下。
使用"$make",便可生成demo.ko模塊。
7 模塊加載與卸載
加載模塊可使用"#insmod demo.ko"或"#modprobe demo.ko",加載成功后,
可通過"#lsmod | grep demo"查看.
卸載模塊可使用"#rmmod demo"。
8 輸出模塊打印信息
使用"#dmesg"可輸出模塊打印信息,demo模塊的輸出信息如下
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。