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

最简单的内核模块

#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  
  1. obj-m += hello.o说明有一个内核模块需要从hello.o构造,生成的模块名称是hello.ko.
    如果hello.ko是由两个源文件生成,例如file1.c file2.c,则应该如下编写
    obj-m := hello.ko
    hello-objs := file1.o file2.0
  2. 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”文件中对应这符号表,它记录了函数的符号和函数在内存所在的地址。

你可能感兴趣的:(linux,内核,驱动)