欢迎使用CSDN-markdown编辑器

来源:互联网 发布:2016年大数据产业规模 编辑:程序博客网 时间:2024/06/02 01:24

写一个简单的module、编译、挂/卸载


写hello.c

写一个linux的模块文件,这样才能进行模块编译。在加载这个模块的时候可以修改这个nbr变量的值。yuer_init()函数将在模块加载的时候运行,通过输出的结果可以看到模块是否加载成功。

#include <linux/init.h>  #include <linux/module.h>      MODULE_AUTHOR("your name");      MODULE_LICENSE("xxx");       static int nbr = 5;      module_param(nbr, int, S_IRUGO);      static int __init yuer_init(void)      {          int i;          for(i=0; i<=nbr;i++)        {              printk(KERN_ALERT "Hello, How are you. %d\n", i);          }          return 0;      }      static void __exit yuer_exit(void)      {          printk(KERN_ALERT"I come from yuer's module, I have been unlad.\n");      }     module_init(yuer_init);      module_exit(yuer_exit);  

写Makefile(非makefile)

obj-m := modules.o                   #要生成的模块名     modules-objs:= mymod.o        #生成这个模块名所需要的目标文件    KDIR := /lib/modules/3.13.0-100-generic/build      #这是我们正在运行的操作系统内核编译目录。也就是编译模块需要的环境    PWD := $(shell pwd)default:    make -C $(KDIR) M=$(PWD) modulesclean:    rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions

obj-m :这个变量是指定你要声称哪些模块模块的格式为 obj-m := <模块名>.o
modules-objs :这个变量是说明声称模块modules需要的目标文件 格式要求 <模块名>-objs := <目标文件>
切记:模块的名字不能取与目标文件相同的名字。如在这里模块名不能取成 mymod;
KDIR :这是我们正在运行的操作系统内核编译目录。也就是编译模块需要的环境
M= :指定我们源文件的位置
PWD :这是当前工作路径$(shell )是make的一个内置函数。用来执行shell命

编译模块

在命令终端进入源文件目录,输入make运行结果:
这里写图片描述

挂载module

从上图的编译结果可以看到。有一个modules.ko生成了。这就是我们的模块。
现在我们就可以来加载了。
首先在终端输入:sudo insmod modules.ko
在终端输入:dmesg | tail -5 这是查看内核输出信息的意思。tail -5 显示最后5条;
显示结果如下:

这里写图片描述
可以看出,模块已经挂载成功,且正常输出了源程序功能。

卸载module

在终端输入:sudo rmmod modules
在终端输入:dmesg | tail -2
这里写图片描述

加载模块时传递参数(nbr)

在终端输入:sudo insmod modules.ko nbr=4
在终端输入:dmesg | tail -6
显示结果如下:
这里写图片描述

查看模块的信息

模块加载成功。我们还可以通过modinfo来查看我们的模块信息。如下
在终端输入:
显示结果:
这里写图片描述

http://blog.sina.com.cn/s/blog_4ba5b45e0102v25h.html

0 0