linux内核模块开发

一,内核模块功能: 让内核文件(zImage或bzImage)本身并不包含某组件,而是在该 
组件需要被使用的时候,动态地添加到正在运行的内核中

二,内核模块安装和卸载
加载:insmod (insmod hello.ko)
卸载:rmmod (rmmod hello)
查看:lsmod
加载:modprobe (modprobe hello)
modprobe如同insmod,也是加载一个模块到内核。它的不同之处在于它会根据文件
/lib/modules/<$version>/modules.dep
来查看要加载的模块,看它是否还依赖于其他模块,如果是,modprobe会首先找到 
这些模块,把它们先加载到内核。

三,模块可选信息:
1、许可证申明
宏MODULE_LICENSE用来告知内核, 该模块带有一个许可证,没有这样的说明,加载模 
块时内核会抱怨。有效的许可证有"GPL“、"GPL v2"、"GPL and 
additionalrights"、"Dual BSD/GPL"、"Dual MPL/GPL"和"Proprietary"。
2、作者申明(可选)
MODULE_AUTHOR(“Simon Li");
3、模块描述(可选)
MODULE_DESCRIPTION("Hello World Module");
4、模块版本(可选)
MODULE_VERSION("V1.0");
5、模块别名(可选)
MODULE_ALIAS("a simple module");
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中出现的该参数
/**************PARAM**************************/
#include<linux/init.h>
#include<linux/module.h>

MODULE_LICENSE("GPL");

static char *name = "Daniel Guo";
static int age = 30;

module_param(age, int, S_IRUGO); 
module_param(name, charp, S_IRUGO);

static int __init hello_init()
{
printk(KERN_EMERG" Name:%s\n", name);
printk(KERN_EMERG" Age:%d\n", age);
return 0;
}

static void __exit hello_exit()
{
printk(KERN_INFO" Module Exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

/***************************************************/
命令:
make
insmod param.ko
rmmod param
insmod param.ko age=12
/****************************************************/

四,内核符号导出
/proc/kallsyms 记录了内核中所有导出的符号的名字与地址。
EXPORT_SYMBOL(func); /*func为函数名称,供其他模块使用的*/
内核符号的导出使用:
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名)
其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块。

http://www.cnblogs.com/FORFISH/p/5188421.html

时间: 2024-10-27 08:09:13

linux内核模块开发的相关文章

Linux内核模块开发基础【转】

本文转载自:http://blog.csdn.net/coding__madman/article/details/51298180 1. 什么是内核模块 内核模块具有以下两个特点:1. 模块本身并不被编译进内核文件(zImage或bzImage),可以根据需求,在内核运行期间动态的安装或卸载. 2. 为什么需要内核模块 原因:Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢,方法1:把所有的组件都编译键内核,即:zImage或bzImage,但这样会导致一个问题:占用

linux内核模块开发基础

1. 什么是内核模块 内核模块具有以下两个特点:1. 模块本身并不被编译进内核文件(zImage或bzImage),可以根据需求,在内核运行期间动态的安装或卸载. 2. 为什么需要内核模块 原因:Linux内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢,方法1:把所有的组件都编译键内核,即:zImage或bzImage,但这样会导致一个问题:占用内存过多.然后内核模块就诞生了,可以不用被编译进内核但是可以动态的添加到正在运行的内核中! 3. 如何使用内核模块 1> 安装模块 i

5、Linux内核模块开发

Linux的模块驱动 接下来写个最简单的驱动程序,就像程序语言的hello world程序. 首先是:hello.c的代码: 这是个最简单的驱动程序.就是打印hello的信息.驱动程序和我们的程序语言结果有点不大一样.驱动模块的入口是倒数第二行的module_init()的函数.驱动模块的出口是module_exit()的函数. 3.接着是makfile文件: 这也是一个很简单的Makefile文件了.Obj-m后面跟的是我们的最终目标依赖的文件hello.o.第三行的KDIR是我们编译进的内核

linux内核模块开发之内核兼容

因为linux内核变化非常快,每个小版本之间数据结构.接口都有可能发生变化,因此为我们写内核模块的兼容性带来了一些问题,经常在某版本上能正常编译的模块,换另一个模块就编译失败了,这时候我们就需要做内核版本兼容了,解决方法如下: 在内核时面有一个linux/version.h头文件,里面有两个宏LINUX_VERSION_CODE和KERNEL_VERSION,可利用这两个宏来协助完成兼容处理,例子代码如下: static struct nf_hook_ops mrs_ops_forward =

【整理】--Linux简单内核模块开发

1.linux 内核模块不被编译到内核文件(zImage,bzImage), 而是在运行期间动态的安装和卸载 2.内核模块包括一下几部分:主体部分设计,编译内核模块,安装卸载NHMK,可选项使用(模块申明,MK参数,符号输出) 3.简单例子: hello.c: #include<linux/init.h>#include<linux/module.h>#include<linux/kernel.h> MODULE_LICENSE("Dual BSD/GPL&q

Linux系统开发7 进程关系,守护进程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发7  进程关系守护进程 终端 网络终端 Linux PCB结构体信息 进程组 修改子进程.父进程的组ID 会话组 设置一个会话脱离控制终端 生成一个新的会话 守护进程 守护进程模板 获取当前系统时间  终端 在UNIX系统中用户通过终端登录系统后得到一个Shell进程这个终端成为Shell进 程的控制终端Controlling Terminal在讲进程时讲过控制终端是保存在PCB

与一线Linux嵌入式开发project师的对话

转:与一线Linux嵌入式开发project师的对话 陈project师一直做Linux的嵌入式开发.作为在开发一线的project师.他对非常多问题的看法可能更切合实际需求,于是,通过邮件.就嵌入式开发方面的问题,请他谈了一下自己的看法: 问:关于嵌入式开发.我们准备给同学们解说一些入门知识.从你一线开发经验来说,给我们一些建议: 陈工回答: 对于嵌入式Linux入门,假设有一定基础,可以从驱动開始:假设没有基础.我个人建议还是从应用程序開始.由于从应用程序開始是最easy的,也是 最直观的.

Linux内核模块编写详解

内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统,本文给大家介绍linux内核模块编写,需要的朋友可以参考下 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统.浮点运算做起来可不容易,堆栈固定而狭小,而你写的代码总是异步的,

Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读

Linux内核模块简介 Linux内核的整体结构已经非常庞大,而其包含的组件也非常多.我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核.这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核. 有没有一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中呢?Linux提供了这样的一种机制,这种机制被称为模块(Module).模块具有这样的特点. 模块本