µÚ19Õ ģ¿éÒÀÀµ¹Øϵ
19-1£ºÄ£¿éµÄ°²×°£¬Ð¶ÔØ£¬²é¿´
°²×°£ºinsmod Ä£¿éÃû.ko
жÔØ£ºrmmod Ä£¿éÃû.ko
²é¿´£ºlsmod
¶îÍâ²¹³ä£ºprintk("FUNCTION: %s LINE: %d\r\n", __FUNCTION__, __LINE__);
__FUNCTION__ºê·µ»Øµ÷ÓÃÆäµÄº¯ÊýÃû
__LINE__ºê·µ»Øµ±Ç°ÐкÅ
19-1£ºÒ»¸öÄ£¿éºÍÒ»¸ö.cÎļþ±àÒë³ÉÒ»¸öÄ£¿é
1) Á½¸öÎļþ module.c fun.c
Module.cÊÇÕæÕýµÄÄ£¿é£¬ÐèҪģ¿éÄ£ÐÍ¿ò¼Ü
Fun.cÊǵ¥´¿µÄÌṩº¯ÊýµÄÔ´Îļþ£¬²»ÐèҪģ¿éÄ£ÐÍ¿ò¼Ü
2) ³ÌÐòÉè¼Æ£ºmodule.cÒªÉùÃ÷º¯Êý£¬È»ºó¾Í¿ÉÒÔµ÷ÓÃÁË
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h>
extern int add(int a, int b); //ÉùÃ÷º¯Êý extern int multi(int a, int b); //ÉùÃ÷º¯Êý
static int __init module_test_init(void) { printk("a + b = %d\r\n", add(10, 20)); printk("a * b = %d\r\n", multi(10, 20)); return 0; }
static void __exit module_test_exit(void) { return; }
module_init(module_test_init); module_exit(module_test_exit); MODULE_LICENSE("GPL"); |
Fun.c½ö½öÌṩº¯ÊýÔÐÍ£¬Á¬Í·Îļþ¶¼²»ÐèÒª
int add(int a, int b) { return a + b; }
int multi(int a, int b) { return a * b; } |
3) MakefileµÄ±àд·½·¨£ºtest-objs+=finename1.ofinename2.o ¡¡
obj-m+=test.o //Ìí¼Ó×îºóÉú³ÉµÄ.oÎļþ test-objs+=module.o fun.o //¾ÍÊÇÕâÒ»Ðн«Á½¸ö.oÎļþºÏ³Éͬһ¸ö.oÎļþ all: make -C /work/kernel/linux-3.5/ M=$(PWD) modules mv *.ko /rootfs/work/ make -C /work/kernel/linux-3.5/ M=$(PWD) modules clean |
19-2£ºÁ½¸öÄ£¿é£¬Ò»¸öÌṩº¯Êý£¬Ò»¸öµ÷ÓÃ
1) Á½¸öÎļþ module.c examp.c, Á½¸ö¶¼ÊÇÄ£¿éÎļþ£¬ÆäÖÐÒ»¸öÓÐÏòÍâÌṩµÄ¹¦Äܺ¯Êý£¬ÁíÍâÒ»¸öµ÷Óá£
2) ³ÌÐòÉè¼Æ£º
Examp.c °üº¬Ä£¿éÄ£ÐÍ£¬²¢ÇÒÌṩº¯ÊýºÍÈ«¾Ö±äÁ¿£¬¹Ø¼üÊÇʹÓÃ
EXPORT_SYMBOL_GPLºê½«ÆäÌṩ¸øÆäËûÄ£¿é£¬´Ëºê¿ÉÒÔÉùÃ÷º¯Êý£¬±äÁ¿£¬Ö¸Õë
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h>
int num; //¶¨ÒåÈ«¾Ö±äÁ¿ EXPORT_SYMBOL_GPL(num); //Ìṩ¸ø±ðµÄÄ£¿éʹÓÃ
int add(int a, int b); int multi(int a, int b);
static int __init examp_test_init(void) { num = 10; printk("num = %d\r\n", num); num = 50; printk("FUNCTION: %s LINE: %d", __FUNCTION__, __LINE__); return 0; }
static void __exit examp_test_exit(void) { printk("FUNCTION: %s LINE: %d", __FUNCTION__, __LINE__); }
module_init(examp_test_init); module_exit(examp_test_exit); MODULE_LICENSE("GPL");
int add(int a, int b) { return a + b; } EXPORT_SYMBOL_GPL(add); //Ìṩ¸ø±ðµÄÄ£¿éʹÓÃ
int multi(int a, int b) { return a * b; } EXPORT_SYMBOL_GPL(multi); //Ìṩ¸ø±ðµÄÄ£¿éʹÓà |
Module.cÐèҪͨ¹ýexternÉùÃ÷º¯ÊýºÍÈ«¾Ö±äÁ¿£¬È»ºó¾Í¿ÉÒÔʹÓÃÁË
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h>
extern int num; extern int add(int a, int b); extern int multi(int a, int b); //±ØÐëÒªÉùÃ÷²ÅÄÜʹÓÃ
static int __init module_test_init(void) { printk("num_call = %d\r\n", num); printk("a + b = %d\r\n", add(10, 20)); printk("a * b = %d\r\n", multi(10, 20)); return 0; }
static void __exit module_test_exit(void) { return; }
module_init(module_test_init); module_exit(module_test_exit); MODULE_LICENSE("GPL"); |
Ä£¿éµÄ±àÒ룺±àÒë³ÉÁ½¸öÄ£¿é¾Í¿ÉÒÔʹÓÃÁË
obj-m+=module.o examp.o all: make -C /work/kernel/linux-3.5/ M=$(PWD) modules mv *.ko /rootfs/work/ make -C /work/kernel/linux-3.5/ M=$(PWD) modules clean |