1銆佹簮紼嬪簭
//hello.c
1. #include <linux/init.h>
2. #include <linux/module.h>
3.
4. MODULE_LICENSE("Dual BSD/GPL");
5.
6. static int hello_init(void)
7. {
8. printk(KERN_ALERT "hello module!\n");
9. return 0;
10. }
11.
12. static void hello_exit(void)
13. {
14. printk(KERN_ALERT "bye module!\n");
15. }
16.
17. module_init(hello_init);
18. module_exit(hello_exit);
2銆侀┍鍔ㄧ▼搴忎粙緇?/span>
涓涓?/span>linux鍐呮牳妯″潡涓昏鐢卞涓嬪嚑涓儴鍒嗙粍鎴愶細
錛?/span>1錛?/span>module鍔犺澆鍑芥暟銆?/span>
褰撻氳繃insmod鎴?/span>modprobe鍛戒護鍔犺澆鍐呮牳module鏃訛紝module鐨勫姞杞藉嚱鏁頒細鑷姩琚唴鏍歌繍琛岋紝瀹屾垚鏈?/span>module鐨勭浉鍏沖垵濮嬪寲宸ヤ綔銆?/span>
module鍔犺澆鍑芥暟閫氳繃module_init()鍑芥暟鍚戝唴鏍告敞鍐屻?/span>
錛?/span>2錛?/span>module鍗歌澆鍑芥暟銆?/span>
rmmod鍛戒護鍗歌澆鏌愪釜妯″潡鏃訛紝妯″潡鐨勫嵏杞藉嚱鏁頒細鑷姩琚唴鏍告墽琛岋紝瀹屾垚鏈ā鍧楀垵濮嬪寲鐨勭浉鍙嶅姛鑳姐?/span>
module鍗歌澆鍑芥暟閫氳繃module_exit()鍑芥暟鍚戝唴鏍告敞鍐屻?/span>
錛?/span>3錛?/span>module璁稿彲澹版槑錛堝繀欏伙級
璁稿彲璇?/span>license澹版槑鎻忚堪鍐呮牳妯″潡鐨勮鍙潈闄愶紝濡傛灉涓嶅0鏄?/span>license錛屾ā鍧楄鍔犺澆鏃訛紝灝嗭紝鏀跺埌鍐呮牳琚薄鏌擄紙kernel tainted錛夌殑璀﹀憡銆?/span>linux涓彲鎺ュ彈鐨?/span>license鍖呮嫭“GPL”錛?#8220;GPL v2”錛?#8220;Dual BSD/GPL”錛?#8220;Dual MPL/GPL”絳夈?/span>
澶氭暟鎯呭喌涓嬶紝鍐呮牳妯″潡搴旈伒寰?/span>GPL鍏煎璁稿彲鏉冿紝2.6鍐呮牳妯″潡鏈甯歌鐨勬槸浠?/span>MODULE_LICENSE("Dual BSD/GPL"錛夎鍙ュ0鏄庢ā鍧楅噰鐢?/span>BSD/GPL 鍙?/span>LICENSE銆?/span>
錛?/span>4錛夋ā鍧楀弬鏁幫紙鍙夛級
錛?/span>5錛夋ā鍧楀埌澶勭鍙鳳紙鍙夛級
錛?/span>6錛夋ā鍧椾綔鑰呯瓑淇℃伅澹版槑錛堝彲閫夛級錛屽MODULE_AUTHOR錛堬級錛?/span>MODULE_DESCRIPTION錛堬級錛?/span>MODULE_ALIAS錛堬級絳夈?/span>
緙栬瘧寰楀埌hello.ko錛岀劧鍚?/span>insmod hello.ko鍔犺澆妯″潡錛?/span>rmmod hello.ko 鍗歌澆妯″潡銆?/span>
linux鍐呮牳鐨勬暣浣撶粨鏋勫凡緇忛潪甯稿簽澶э紝鑰屽叾鍖呭惈鐨勭粍浠朵篃闈炲父澶氾紝鏈変袱縐嶆柟娉曟妸闇瑕佺殑閮ㄥ垎閮藉寘鍚湪鍐呮牳涓?/span>
涓錛屾妸鎵鏈夊姛鑳介兘緙栬瘧榪涘唴鏍革紝浣嗚繖鍥炲鑷翠袱涓棶棰橈紝鐢熸垚鐨勫唴鏍鎬細鐗瑰埆鎵擄紝鍋囧瑕佹妸鐜板湪鐨勫唴鏍稿鍔犳垨鍒犻櫎鍔熻兘錛屽皢涓嶅緱涓嶉噸鏂扮紪璇戞暣涓唴鏍搞?/span>
浜岋紝浣跨敤妯″潡module錛屼笂榪版垜浠啓鐨勬渶綆鍗曢┍鍔紝灝辨槸涓涓ā鍧?/span>module錛屽彲浠ラ殢鎰忕殑澧炲姞鎴栧垹闄ゃ?/span>
3銆?/span>Makefile鏂囦歡
鎬庢牱鎶?/span>hello.c婧愭枃浠剁紪璇戞垚helo.ko鍐呮牳妯″潡鍛紝鍚屾牱浣跨敤make錛屼絾榪欓噷鐨?/span>Makefile涓庝竴鑸殑搴旂敤紼嬪簭Makefile鏈夋墍涓嶅悓錛岄┍鍔?/span>Makfile瑕佹寚瀹氬唴鏍告簮浠g爜浣嶇疆錛屽厛鐪嬩竴涓畝鍗曠殑椹卞姩Makefile錛?/span>
1. obj-m := hello.o
2. KERNEL_DIR := /lib/modules/$(shell uname -r)/build
3. PWD := $(shell pwd)
4. all:
5. make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
6. clean:
7. rm *.o *.ko *.mod.c
8.
9. .PHONY:clean
KERNEL_DIR涓哄唴鏍告簮浠g爜build鐩綍錛屾垜浠煡閬擄紝鍐呮牳瀛樻斁鍦?/span>/usr/src涓紝/lib/modules鍏跺疄鏄繛鎺ュ埌榪欎釜鍦版柟錛屽湪shell涓墽琛?/span>uname -r浼氬緱鍒版鍦ㄤ嬌鐢ㄧ殑瀹屾暣鍐呮牳鐗堟湰鍙鳳紝榪欐牱灝遍夋嫨浜嗛傚綋鐨勫唴鏍告簮鐮併?/span>
PWD涓烘簮鏂囦歡hello.c鎵鍦ㄧ洰褰曘?/span>
make -C 錛堝ぇ鍐?/span>C錛?/span> make浼氳繘鍏?/span>KERNEL_DIR鐩綍鎵ц姝ょ洰褰曚笅鐨?/span>Makefile錛岀劧鍚庡湪榪斿洖PWD鐩綍鎵ц鑷繁鍐欑殑Makefile銆?/span>
4銆佸湪緇堢涓?/span>make
1. [root@localhost driver]# make
2. make -C /lib/modules/2.6.9-89.ELsmp/build SUBDIRS=/root/linux/driver modules
3. make[1]: Entering directory `/usr/src/kernels/2.6.9-89.EL-smp-i686'
4. CC [M] /root/linux/driver/hello.o
5. Building modules, stage 2.
6. MODPOST
7. CC /root/linux/driver/hello.mod.o
8. LD [M] /root/linux/driver/hello.ko
9. make[1]: Leaving directory `/usr/src/kernels/2.6.9-89.EL-smp-i686'
榪欐牱hello.ko椹卞姩妯″潡灝變駭鐢熷ソ浜嗐?/span>
5銆?/span>insmod鍔犺澆
1. [root@localhost driver]# insmod hello.ko
6銆?/span>lsmod鏌ョ湅妯″潡
lsmod涓涓嬪氨浼氱湅鍒?/span>hello妯″潡鐨勫瓨鍦ㄤ簡錛屽茍涓斿湪緋葷粺鐨勬棩蹇?/span>/var/log/messages涓細璁板綍妯″潡鐨勮緭鍑猴紝涔熷氨鏄?/span>
1. printk(KERN_ALERT "hello module!\n");
杈撳嚭鐨?/span>hello module錛?/span>
1. <pre name="code" class="plain">[root@localhost driver]#tail -1 /var/log/messages
2. Oct 13 11:27:07 localhost kernel: hello module!
7銆?/span>rmmod helle 鍗歌澆hello.ko