Linux内核模块开发(笔记)(2)

发表于:2013-10-14来源:IT博客大学习作者:扶凯点击数: 标签:linux
放个编译上面模块的 Makefile obj-m := hello.o all: make -C /lib/modules/$(shell uname -r )/build M=$(shell pwd) modules clean: make -C /lib/modules/$(shell uname -r )/build M=$(shell pwd) clea

  放个编译上面模块的 Makefile

obj-m := hello.o
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

  给 Makefile 放到上面 hello.c 的相同的目录中(如果上面写的模块代码叫 hello.c 的话)。然后使用 make 就能编译了。

  insmod lsmod rmmod

  调用 insmod 时会给需要的模块加载进内核,会给 ko 的文件以目标代码加载。装载时会调用 module_init 指定的函数。退出也调用相应的 module_exit.

  lsmod 可以显示你写的模块,其实是读 /proc/modules 。接下来我写写怎么样自己通过内核来建 proc 文件。

  模块加载参数

  如果在模块加载时,想指定参数,也提供了相应的头文件

#include <linux/moduleparam.h>
static int test;
module_param(test, int, 0644);

  这样以后,直接在内核模块内使用 test 的变量就行了。

  模块的信息

  在程序中可以为模块加一些描述,发行版权声明,和作者。

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Test");
MODULE_AUTHOR("xxx");

  模块的符号导出

  在 Perl 中,模块是可以导出变量和方法到其它的模块中的。在 Linux 内核中也有这样的方法。

EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);

  这二个可以导出指定的全局变量,也可以是方法。这个要加载 的头文件,不要忘记了。

  其它的模块要使用这个,直接使用 extern void name(void); 就可以使用了。这些导出的函数只能内核和内核模块使用。不能用户调用,可以由 /proc/kallsyms 来查看导出的变量和方法

  实例

  写个内核模块,通过 proc 可以见到一些信息,通过 proc 的读和写的功能。来实现设置和读取信息。

  proc 介绍

  proc 是一个非常方便的用来动态的向 Linux 内核加入和禁用代码的一个方法。

  proc/sys 中是用来配置内核的参数,可以通过 sysctl -w key=value

  象普通文件可以支持 open,read,write,close

原文转自:http://blogread.cn/it/article/4630