码迷,mamicode.com
首页 > 系统相关 > 详细

Linux内核模块简单示例

时间:2018-08-17 12:12:17      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:bool   class   加载   代码   通过   编译   问题   安装   stat   

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\n");
    return 0;    
}

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

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内核模块简单示例

标签:bool   class   加载   代码   通过   编译   问题   安装   stat   

原文地址:https://www.cnblogs.com/wulei0630/p/9492577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!