Linux内核模块开发基础

Posted 请给我倒杯茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核模块开发基础相关的知识,希望对你有一定的参考价值。

本文转载自:http://blog.csdn.net/coding__madman/article/details/51298180

1. 什么是内核模块

    内核模块具有以下两个特点:1. 模块本身并不被编译进内核文件(zImage或bzImage),可以根据需求,在内核运行期间动态的安装或卸载。

2. 为什么需要内核模块

 原因:Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢,方法1:把所有的组件都编译键内核,即:zImage或bzImage,但这样会导致一个问题:占用内存过多。然后内核模块就诞生了,可以不用被编译进内核但是可以动态的添加到正在运行的内核中!

3. 如何使用内核模块

   1> 安装模块 insmod filename.ko

    2> 卸载模块 rmmod filename

    3> 查看模块 lsmod

 

这里举一个简单的例子:

还是亘古不变的方式helloworld程序(不过这里没有main函数的)

 

[html] view plain copy
 
  1. #include <linux/init.h>  
  2. #include <linux/module.h>  
  3.   
  4.   
  5. static int hello_init()  
  6. {  
  7.     printk(KERN_WARNING"Hello world!\n");//前面的宏表示打印的级别  
  8.     return 0;     
  9. }  
  10.   
  11. static void hello_exit()  
  12. {  
  13.     printk(KERN_WARNING"hello exit!\n");      
  14. }  
  15.   
  16. module_init(hello_init);//用宏来指定入口 加载模块时里面的加载函数会被调用  
  17. module_exit(hello_exit);  

 

三要素: 加载模块 、卸载模块、 头文件


Makefile文件

 

[html] view plain copy
 
  1. obj-m := helloworld.o  
  2.   
  3. KDIR := /home/kernel/linux-ok6410 //开发板运行的内核的源码的路径,因为模块最后是要在开发板上运行,所以这个模块的编译是要依赖板子上运行的内核源码的,(这里我开发板用的内核源码是这个路径)  
  4.   
  5. all:  
  6.     make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm  
  7.       
  8. clean:  
  9.     rm -f *.o *.ko *.order *.symvers  
  10.       

这里KDIR是我们内核源码的路径:

 

技术分享
然后make 编译模块文件,这可可以看到生成了helloworld.ko文件

技术分享

结合前面的课程这里可以通过串口终端同步看到(一下可以看到相关命令执行的效果)

技术分享

 

内核模块的可选项:

1. 模块申明

技术分享

2. 模块参数

技术分享

3. 符号输出

技术分享

以上是关于Linux内核模块开发基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux驱动开发基础

嵌入式Linux驱动开发 02:将驱动程序添加到内核中

专题5-内核模块开发1

IoT嵌入式开发:Linux内核开发基础

Linux内核开发基础

Linux SID 开发指南