Linux模块编程机制之hello kernel


看了那么多理论知识,可能还是一头雾水,是啊,纯理论分析本来就不好理解。为了更好的理解Linux内核各种内部机制以及其运用,在接下来的学习中将采用理论+实验+源码注释的方式进行。包括算法、原理的实验,内核的局部扩展与修改等。Linux内核编程有很多方法,最方便的方式是使用内核提供的模块编程机制,另一种方式是以补丁的方式,这种方式只需要编译一次内核,当然也可以直接修改内核源码,但是每次修改后都需要重新编译、引导、重启,很麻烦,也很费时。首先,我们看看最方便快捷的一种方式——LINUX内核中模块编程机制。

还是从程序员的哪个起步程序hello world开始,但是我们这里比一般的hello world稍微复杂一点,用两个hello world程序。

文件hello.c

  1. #include <linux/init.h>   
  2. #include <linux/module.h>   
  3. #include <linux/kernel.h>   
  4.   
  5. MODULE_LICENSE("GPL");  
  6. extern int hello_data;  
  7.   
  8. static int hello_init(void)  
  9. {  
  10.     printk(KERN_ERR "hello,kernel!,this is hello module\n");  
  11.     printk(KERN_ERR "hello_data:%d\n",++hello_data);  
  12.     return 0;  
  13. }  
  14.   
  15. static void hello_exit(void)  
  16. {  
  17.     printk(KERN_ERR "hello_data:%d\n",--hello_data);  
  18.     printk(KERN_ERR "Leave hello module!\n");  
  19. }  
  20. module_init(hello_init);  
  21. module_exit(hello_exit);  
  22.   
  23. MODULE_AUTHOR("Mike Feng");  
  24. MODULE_DESCRIPTION("This is hello module");  
  25. MODULE_ALIAS("A simple example");  

对应的Makefile文件:

  1. obj-m +=hello.o  
  2. CURRENT_DIR:=$(shell pwd)  
  3. KERNEL_DIR:=$(shell uname -r)  
  4. KERNEL_PATH:=/usr/src/kernels/$(KERNEL_DIR)  
  5.   
  6. all:  
  7.     make -C $(KERNEL_PATH) M=$(CURRENT_DIR) modules  
  8. clean:  
  9.     make -C $(KERNEL_PATH) M=$(CURRENT_DIR) clean  

文件hello_h.c:

  1. #include <linux/init.h>   
  2. #include <linux/module.h>   
  3. #include <linux/kernel.h>   
  4.   
  5. MODULE_LICENSE("GPL");  
  6. static unsigned int hello_data=100;  
  7. EXPORT_SYMBOL(hello_data);  
  8.   
  9. static int hello_h_init(void)  
  10. {  
  11.     hello_data+=5;  
  12.     printk(KERN_ERR "hello_data:%d\nhello kernel,this is hello_h module\n",hello_data);  
  13.   
  14.     return 0;  
  15. }  
  16.   
  17. static void hello_h_exit(void)  
  18. {  
  19.     hello_data-=5;  
  20.     printk(KERN_ERR "hello_data:%d\nleave hello_h module\n",hello_data);  
  21. }  
  22.   
  23. module_init(hello_h_init);  
  24. module_exit(hello_h_exit);  
  25. MODULE_AUTHOR("Mike Feng");  

对应的Makefile

  1. obj-m+=hello_h.o  
  2. CURRENT:=$(shell pwd)  
  3. KERNEL_PATH:=/usr/src/kernels/$(shell uname -r)  
  4.   
  5. all:  
  6.     make -C $(KERNEL_PATH) M=$(CURRENT) modules  
  7. clean:  
  8.     make -C $(KERNEL_PATH) M=$(CURRENT) clean  

可见,我们在hello_h.c中定义了一个静态变量hello_data,初始值为100,并把他导出了,在hello.c中使用了该变量。这样给出例子,后面我们会看到,是为了说明模块依赖。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一页

相关内容