Linux内核模块简单示例

Posted 99度的水

tags:

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

1. Linux 内核的整体结构非常庞大,其包含的组件也非常多,使用这些组件的方法有两种:

① 直接编译进内核文件,即zImage或者bzImage(问题:占用内存过多)

② 动态添加

  * 模块本身并不被编译进内核文件

  * 根据需求,在内核运行期间动态安装或卸载

 

2. 内核模块动态安装与卸载

①安装 insmod

例:insmod /home/dnw_usb.ko

②卸载 rmmod

例:rmmod dnw_usb

③查看 lsmod

例: lsmod

 

3. 模块声明

① MODULE_LICENSE()

② MODULE_AUTHOR()

③ MODULE_DESCRIPTION()

④ MODULE_VERSION()

 

4. 模块参数

① 模块参数用于在加载模块时传递参数给模块

② 通过宏module_param指定保存模块参数的变量

  module_param(name, type, perm)

  * name:变量的名称

  * type:变量类型。bool:布尔型,int:整型,charp:字符串型

  * perm是访问权限。S_IRUGO:读权限,S_IWUSR:写权限

③ 简单示例

int a = 3;
module_param(a, int, SIRUGO);

命令行:insmod xxx.ko a = 10

 

5. 符号导出

① 如果内核模块中的函数或者全局变量想让其他模块使用,必须进行导出

② 内核符号导出使用宏

  EXPORT_SYMBOL(符号名)

  EXPORT_SYMBOL_GPL(符号名)

  注:其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块

 

6. 内核模块简单示例

① 模块代码:

#include <linux/init.h>
#include <linux/module.h>

static int hello_init()
{
    printk(KERN_WARNING"Hello world initlizing
");
    return 0;    
}

static void hello_exit()
{
    printk(KERN_WARNING"Hello world exiting
");    
}

module_init(hello_init);
module_exit(hello_exit);

 

② Makefile:

obj-m := helloworld.o

KDIR := /home/Linux/Kernal/linux-2.6.29

all:
    make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
    
clean:
    rm -f *.o *.ko *.order *.symvers
    

 

以上是关于Linux内核模块简单示例的主要内容,如果未能解决你的问题,请参考以下文章

编写简单Linux内核模块

5Linux内核模块开发

编写简单的内核模块

[Mini2440] 最简单的内核模块

一个简单的内核模块

Linux内核模块编程与内核模块LICENSE -《具体解释(第3版)》预读