您的位置:首页 > 运维架构 > Linux

Linux设备驱动(1)模块的相关概念

2016-05-08 09:33 423 查看

最简单的内核模块

#include<linux/init.h>
#include<linux/module.h>
static int __init hello_init(void) //内核初始化函数
{
printk("hello world!\n"); //打印函数,和prinft类似
return 0;
}

static void __exit hello_exit(void)//内核清除函数
{
printk("good bye!\n");
}

module_init(hello_init); //指定初始化函数
module_exit(hello_exit); //指定清除函数

MODULE_LICENSE("GPL"); //指定代码使用的许可证
MODULE_AUTHOR("laowu"); //指定作者
MODULE_VERSION("1.0"); //指定代码修订号


内核模块的makefile

obj-m := hello.o
KDIR:=~/linux-2.6
make -C $(KDIR) M=`pwd` modules


obj-m := hello.o说明有一个内核模块需要从hello.o构造,生成的模块名称是hello.ko.

如果hello.ko是由两个源文件生成,例如file1.c file2.c,则应该如下编写

obj-m := hello.ko

hello-objs := file1.o file2.0

make -C $(KDIR) M=
pwd
modules

首先改变目录到-C指定的位置(即内核源代码目录),其中保存有内核的顶层makefile文件, M=选项,让该makefile在构造modules目标之前返回到模块源代码目录

内核的插入

insmod hello.ko

内核参数

module_param函数使用方法:

module_param(name, type, perm)

name:内核参数的名称,自己定义;

type:内核参数的类型,常见的类型byte、short、int、long、ulong、bool 、charp(字符指针);

perm:内核参数的权限S_IRUGO(对模块参数具有读权限)。其实权限和文件的 权限差不多

内核加载模块时传递参数的方法:

使用命令:insmod xxx.ko a=1

模块加载后,并且他的权限不为0,就可在/sys/module/xxx/parameter目录下 找到对应的模块参数。

导出符号表

使用EXPORT_SYMBOL将函数导出,供其他模块使用;在”/proc/kallsyms”文件中对应这符号表,它记录了函数的符号和函数在内存所在的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: