è¿ç¯æç« ä¸»è¦ä»ç»äº
Linuxå
æ ¸æ¨¡åçç¸å
³æ¦å¿µï¼ä»¥åç®åç模åå¼åè¿ç¨ã主è¦ä»æ¨¡åå¼åä¸ç常ç¨æ令ãå
æ ¸æ¨¡åç¨åºçç»æã模å使ç¨è®¡æ°ä»¥å模åçç¼è¯çè§åº¦å¯¹å
æ ¸æ¨¡åè¿è¡ä»ç»ãå¨Linuxç³»ç»å¼åè¿ç¨ä¸ï¼ä»¥æ¨¡åçå½¢å¼å¼åå
¶éè¦æ§ä¸è¨èªæï¼èå¨åµå
¥å¼è®¾å¤é©±å¨å¼åä¸å°
驱å¨ç¨åºä»¥æ¨¡åçå½¢å¼åå¸ï¼æ´æ¯æ大å°æé«äºè®¾å¤ä½¿ç¨ççµæ´»æ§ââç¨æ·åªéè¦æ¿å°ç¸å
³é©±å¨æ¨¡åï¼åæå
¥å°ç¨æ·çå
æ ¸ä¸ï¼å³å¯çµæ´»å°ä½¿ç¨ä½ ç设å¤ã
äº. æç« æ纲
1. æè¦
2. æç« æ纲
3. æ¦è¿°
4. 模åå¼å常ç¨çæ令
5. å
æ ¸æ¨¡åç¨åºç»æ
6. 模å使ç¨è®¡æ°
7. 模åçç¼è¯
8. 使ç¨æ¨¡åç»å¼GPL
9. æ»ç»
ä¸.æ¦è¿°
Linuxå
æ ¸æ´ä½ç»æå·²ç»å¾åºå¤§ï¼å
å«äºå¾å¤çç»ä»¶ï¼è对äºæ们工ç¨å¸èè¨ï¼æ两ç§æ¹æ³å°éè¦çåè½å
å«è¿å
æ ¸å½ä¸ã
ä¸ï¼å°ææçåè½é½ç¼è¯è¿Linuxå
æ ¸ã
äºï¼å°éè¦çåè½ç¼è¯æ模åï¼å¨éè¦çæ¶åå¨æå°æ·»å ã
ä¸è¿°ä¸¤ç§æ¹å¼ä¼ç¼ºç¹åæï¼
第ä¸ç§ï¼
ä¼ç¹ï¼ä¸ä¼æçæ¬ä¸å
¼å®¹çé®é¢ï¼ä¸éè¦è¿è¡ä¸¥æ ¼ççæ¬æ£æ¥
缺ç¹ï¼çæçå
æ ¸ä¼å¾å¤§ï¼è¦å¨ç°æçå
æ ¸ä¸æ·»å æ°çåè½ï¼åè¦ç¼è¯æ´ä¸ªå
æ ¸
第äºç§ï¼
ä¼ç¹ï¼æ¨¡åæ¬èº«ä¸ç¼è¯è¿å
æ ¸ï¼ä»èæ§å¶äºå
æ ¸ç大å°ï¼æ¨¡åä¸æ¦è¢«å è½½ï¼å°åå
¶å®çé¨åå®å
¨ä¸æ ·ã
缺ç¹ï¼å¯è½ä¼æå
æ ¸ä¸æ¨¡åçæ¬ä¸å
¼å®¹çé®é¢ï¼å¯¼è´å
æ ¸å´©æºï¼ä¼é æå
åçå©ç¨çæ¯è¾ä½ã
å.模åå¼å常ç¨çæ令
å¨å
æ ¸æ¨¡åå¼åçè¿ç¨ä¸å¸¸ç¨çæ以ä¸æ令ã
1ï¼ insmod: å°æ¨¡åæå
¥å
æ ¸ä¸ï¼ä½¿ç¨æ¹æ³ï¼#insmod XXX.ko
2ï¼ rmmod: å°æ¨¡åä»å
æ ¸ä¸å é¤ï¼ä½¿ç¨æ¹æ³ï¼#rmmod XXX.ko
3ï¼ lsmod: å表æ¾ç¤ºææçå
æ ¸æ¨¡åï¼å¯ä»¥ågrepæ令ç»å使ç¨ã使ç¨æ¹æ³ï¼#lsmod | grep XXX
4ï¼ modprobe: modprobeå¯è½½å
¥æå®ç个å«æ¨¡åï¼ææ¯è½½å
¥ä¸ç»ç¸ä¾èµç模åãmodprobeä¼æ ¹æ®depmodæ产ççä¾èµå
³ç³»ï¼å³å®è¦è½½å
¥åªäºæ¨¡åãè¥å¨è½½å
¥è¿ç¨ä¸åçé误ï¼å¨modprobeä¼å¸è½½æ´ç»ç模åãä¾èµå
³ç³»æ¯éè¿è¯»å /lib/modules/2.6.xx/modules.depå¾å°çãè该æ件æ¯éè¿depmod æ建ç«ã
5ï¼ modinfo: æ¥ç模åä¿¡æ¯ã使ç¨æ¹æ³ï¼#modinfo XXX.ko
6ï¼ tree âa: æ¥çå½åç®å½çæ´ä¸ªæ ç»æã使ç¨æ¹æ³ï¼#tree -a
äº.å
æ ¸æ¨¡åç¨åºç»æ
1ï¼ æ¨¡åå è½½å½æ°ï¼ä¸è¬éè¦ï¼
å¨ç¨insmodæmodprobeå½ä»¤å 载模åæ¶ï¼è¯¥å½æ°è¢«æ§è¡ãå®æ模åçåå§åå·¥ä½ã
Linuxå
æ ¸ç模åå è½½å½æ°ä¸è¬ç¨__initæ è¯å£°æï¼æ¨¡åå è½½å½æ°å¿
须以module_init(å½æ°å)çå½¢å¼è¢«æå®ã该å½æ°è¿å
æ´åå¼ï¼å¦ææ§è¡æåï¼åè¿å0ï¼åå§å失败æ¶åè¿åé误ç¼ç ï¼Linuxå
æ ¸å½ä¸çé误ç¼ç æ¯è´å¼ï¼å¨<linux/errno.h>ä¸å®ä¹ã
å¨Linuxä¸ï¼æ è¯__initçå½æ°å¨è¿æ¥æ¶æ¾å¨.init.textè¿ä¸ªåºæ®µï¼èä¸å¨.initcall.initä¸ä¿çä¸ä»½
å½æ°æéï¼åå§åçæ¶åå
æ ¸ä¼æ ¹æ®è¿äºæéè°ç¨åå§åå½æ°ï¼åå§åç»æåéæ¾è¿äºinitåºæ®µï¼å
æ¬å两è
ï¼ã
代ç æ¸
åï¼
1 static int __init XXX_init(void)
2
3 {
4
5 return 0;
6 }
7
8
9
10 moudle_init(XXX_init);
2ï¼ æ¨¡åå¸è½½å½æ°ï¼ä¸è¬éè¦ï¼
å¨ç¨rmmodæmodprobeå½ä»¤å¸è½½æ¨¡åæ¶ï¼è¯¥å½æ°è¢«æ§è¡ãå®æä¸å è½½ç¸åçå·¥ä½ã
模åçå¸è½½å½æ°å模åå è½½å½æ°å®ç°ç¸åçåè½ï¼ä¸»è¦å
æ¬
è¥æ¨¡åå è½½å½æ°æ³¨åäºXXXï¼å模åå¸è½½å½æ°æ³¨éXXX
è¥æ¨¡åå è½½å½æ°å¨æåé
äºå
åï¼å模åå¸è½½å½æ°éæ¾è¿äºå
å
è¥æ¨¡åå è½½å½æ°ç³è¯·äºç¡¬ä»¶èµæºï¼å模åå¸è½½å½æ°éæ¾è¿äºç¡¬ä»¶èµæº
è¥æ¨¡åå è½½å½æ°å¼å¯äºç¡¬ä»¶èµæºï¼å模åå¸è½½å½æ°ä¸å®è¦å
³éè¿äºèµæº
代ç æ¸
åï¼
1 static void __exit XXX_exit(void)
2
3 {
4
5 }
6
7
8
9 moudle_exit(XXX_exit);
3ï¼ æ¨¡å许å¯è¯å£°æï¼å¿
é¡»ï¼
å¦æä¸å£°æï¼åå¨æ¨¡åå è½½æ¶ä¼æ¶å°å
æ ¸è¢«æ±¡æçè¦åï¼ä¸è¬åºéµå¾ª
GPLåè®®ã
代ç æ¸
åï¼
1 MODULE_LICENSE("GPL");
4ï¼ æ¨¡ååæ°ï¼å¯éï¼
模åå¨è¢«å è½½æ¶ä¼ éç»æ¨¡åçå¼ï¼æ¬èº«åºè¯¥æ¯æ¨¡åå
é¨ç
å
¨å±åéã
示ä¾ç¨åºbook.c
1 #include <linux/init.h>
2
3 #include <linux/module.h>
4
5
6
7 static char *bookName = "Good Book.";
8
9 static int bookNumber = 100;
10
11
12
13 static int __init book_init(void)
14
15 {
16
17 printk(KERN_INFO "Book name is %s\n", bookName);
18
19 printk(KERN_INFO "Book number is %d\n", bookNumber);
20
21 return 0;
22
23 }
24
25
26
27 static void __exit book_exit(void)
28
29 {
30
31 printk(KERN_INFO "Book module exit.\n");
32
33 }
34
35
36
37 module_init(book_init);
38
39 module_exit(book_exit);
40
41 module_param(bookName, charp, S_IRUGO);
42
43 module_param(bookNumber, int, S_IRUGO);
44
45
46
47 MODULE_LICENSE("GPL");
å¨åå
æ ¸æå
¥æ¨¡åçæ¶åå¯ä»¥ç¨ä»¥ä¸æ¹å¼ï¼å¹¶ä¸å¯ä»¥å¨å
æ ¸æ¥å¿ä¸çå°æ¨¡åå 载以ååéå·²ç»æäºå¼ã
5ï¼ æ¨¡å导åºç¬¦å·ï¼å¯éï¼
使ç¨æ¨¡å导åºç¬¦å·ï¼æ¹ä¾¿å
¶å®æ¨¡åä¾èµäºè¯¥æ¨¡åï¼å¹¶ä½¿ç¨æ¨¡åä¸çåéåå½æ°çã
å¨Linux2.6çå
æ ¸ä¸ï¼/proc/kallsymsæ件对åºç符å·è¡¨ï¼å®è®°å½äºç¬¦å·å符å·å¯¹åºçå
åå°åã对äºæ¨¡åèè¨ï¼ä½¿ç¨ä¸é¢çå®å¯ä»¥å¯¼åºç¬¦å·ã
1 EXPORT_SYMBOL(符å·å);
æ
1 EXPORT_GPL_SYMBOL(符å·å);
6ï¼ æ¨¡åä¿¡æ¯ï¼å¯éï¼
模åä¿¡æ¯åæ¯æ模åçä½è
ä¿¡æ¯çã
å
.模å使ç¨è®¡æ°
Linuxå
æ ¸æä¾äºMOD_INC_USE_COUNTåMOD_DEC_USE_COUNTå®æ¥ç®¡ç模å使ç¨è®¡æ°ãä½æ¯å¯¹äºå
æ ¸æ¨¡åèè¨ï¼ä¸è¬ä¸ä¼èªå·±ç®¡ç使ç¨è®¡æ°ã
ä¸.模åçç¼è¯
å°ä¸é¢çMakefileæ件æ¾å¨book.cå级çç®å½ä¸ï¼ç¶å使ç¨#makeå½ä»¤æè
#make allå½ä»¤ç¼è¯å³å¯çæbook.ko模åæ件ã
对åºçMakefileï¼
1 ifneq ($(KERNELRELEASE),)
2
3 mymodule_objs := book.o
4
5 obj-m := book.o
6
7 else
8
9 PWD := $(shell pwd)
10
11 KVER ?= $(shell uname -r)
12
13 KDIR := /usr/src/linux-headers-2.6.38-8-generic
14
15
16
17 all:
18
19 $(MAKE) -C $(KDIR) M=$(PWD)
20
21 clean:
22
23 rm -rf *.mod.c *.mod.o *.ko *.o *.tmp_versions *.order *symvers
24
25 endif
å
«.使ç¨æ¨¡åç»å¼
å¦æåè½ä¸ç¼è¯æ模åï¼åæ æ³ç»å¼GPLï¼ç¼è¯æ模ååå
¬å¸åå¸äº§åååªéè¦åå¸æ¨¡åï¼èä¸éè¦åå¸æºç ã为äºLinuxç³»ç»è½å¤æ¯æ模åï¼éè¦å以ä¸çå·¥ä½ï¼
å
æ ¸ç¼è¯æ¶éæ©âå¯ä»¥å 载模åâï¼åµå
¥å¼äº§åä¸è¬é½ä¸éè¦å¸è½½æ¨¡åï¼åå¯ä»¥ä¸éæ©âå¯å¸è½½æ¨¡åâ
å°æ们çkoæ件æ¾å¨
æ件系ç»ä¸
Linuxç³»ç»å®ç°äºinsmodãrmmodçå·¥å
·
使ç¨æ¶å¯ä»¥ç¨insmodæå¨å 载模åï¼ä¹å¯ä»¥ä¿®æ¹/etc/init.d/rcSæ件ï¼ä»èå¨ç³»ç»å¯å¨çæ¶åå°±å 载模åã