linux 学习- 编程基础之内核模块开发

内核模块程序:

#include<linux/init.h>
#include<linux/module.h>
static int hello_init(void)
{
 printk(KERN_WARNING"HELLO,WORLD/n");
 return 0;
}
static int hello_exit(void)
{
 printk(KERN_INFO"GOODBYE,WORLD/n");
}
module_init(hello_init);      //装载模块函数
module_exit(hello_exit);    //卸载模块函数


编译模块函数:makefile
可以作为模板

ifneq ($(KERNELRELEASE),)     //如果不等于空运行obj-m := hello.o

obj-m := hello.o  //模块名字  可修改

else     
 
KDIR := /lib/modules/2.6.18-53.el5/build  //指定内核代码所在目录 , 可修改
all:
 make -C $(KDIR) M=$(PWD) modules  //M 指定内核模块所在位置   PWD 当前目录 执行
clean:
 rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

多个内核模块编译:

ifneq ($(KERNELRELEASE),)

obj-m := mymodule.o        //指定最终生成名字,只需替换名字
mymodule-objs := file1.o file2.o file3.o   

else
 
KDIR := /lib/modules/2.6.18-53.el5/build
all:
 make -C $(KDIR) M=$(PWD) modules
clean:
 rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif


安装与卸载

insmod   安装  如:  insmod hello.ko

rmmod   卸载  如:  rmmod hello


查看模块:
  lsmod

加载模块: 
  modprobe

    同insmod   区别是:   可以自动先加载依赖的其他模块

 


模块可选信息:

1 ,许可证声明:

MODULE_LICENSE


2 , 作者声明:

MODULE_AUTHOR("SSS")

 

 

3,  模块版本

MODULE_VERSION("V1.0")

 

 

4,  模块描述

MODULE_DESCRIPTION("HELLO WORLD")

 

 

5,  模块别名

MODULE_ALIAS("A A")

 

 

6,  模块参数

module_param 

 

 

 module_param(name,type,perm)

name  模块参数名称,type参数的类型
perm  模块参数访问权限

type: bool布尔型  int整型  charp 字符串

perm : S_IRUGO      任何用户都对/sys/module/中出现参数具有读权限
            S_IWUSR      允许root用户修改/sys/module 中出现的该参数


eg:  

int a=3;
char*st;
module_param(a,int,S_IRUGO); 
module_param(st,charp,S_IRUGO);  //指明为字符串的模块参数

eg:

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

MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");

static int __init hello_init()
{
    printk(KERN_EMERG"Hello World!/n");
    return 0;
}

static void __exit hello_exit()
{
    printk("<6>hello exit/n");
}

module_init(hello_init);
module_exit(hello_exit);

你可能感兴趣的:(linux 学习- 编程基础之内核模块开发)