内核模块的编写1

本文介绍了一个简单的Linux模块示例,包括模块的初始化和退出过程,以及如何使用 printk 函数进行输出。此外,还介绍了如何使用 insmod 和 rmmod 工具进行模块的加载和卸载,并展示了如何通过 sysfs 文件系统配置和查看模块参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");// 是用来告知内核, 该模块带有一个自由的许可证; 没有这样的说明, 在模块加载时内核会抱怨.
 

static int hello_init(void)
{
        printk(KERN_ALERT "Hello, world\n");//printk 函数在 Linux 内核中定义并且对模块可用
                                                  // 在 insmod 加载了它之后, 模块被连接到内核并且可存取内核的公用符号
                                                  //字串 KERN_ALERT 是消息的优先级
        return 0;
}

static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);//特别的内核宏来指出这两个函数的角色,
                     //一个在模块加载到内核时被调用( hello_init )以及一个在模块被去除时被调用( hello_exit )
module_exit(hello_exit);
 

最后 你可以用 insmod 和 rmmod 工具来测试这个模块. 注意只有超级用户可以加载和卸载模块.


EXPORT_SYMBOL(name);
EXPORT_SYMBOL_GPL(name);
 
上面宏定义的任一个使得给定的符号在模块外可用. _GPL 版本的宏定义只能使符号对 GPL 许可的模块可用.


可以在模块中包含的其他描述性定义有 
MODULE_AUTHOR ( 声明谁编写了模块 ), 
MODULE_DESCRIPION( 一个人可读的关于模块做什么的声明 ), 
MODULE_VERSION ( 一个代码修订版本号; 看 <linux/module.h> 的注释以便知道创建版本字串使用的惯例), 
MODULE_ALIAS ( 模块为人所知的另一个名子 ), 以及 
MODULE_DEVICE_TABLE ( 来告知用户空间, 模块支持那些设备 ). 


#include <linux/moduleparam.h> 
module_param(variable, type, perm);要想在 sysfs下可见(可以在模块加载时修改的参数),必须通过宏 module_param 来显式声明,该宏有三个参数,第一个为参数名,即已经定义的变量名,第二个参数则为变量类型,可用的类型有 byte, short, ushort, int, uint, long, ulong, charp 和 bool 或 invbool,分别对应于 c 类型 char, short, unsigned short, int, unsigned int, long, unsigned long, char * 和 int,用户也可以自定义类型 XXX(如果用户自己定义了 param_get_XXX,param_set_XXX 和 param_check_XXX)。该宏的第三个参数用于指定访问权限,如果为 0,该参数将不出现在 sysfs 文件系统中,允许的访问权限为 S_IRUSR, S_IWUSR,S_IRGRP,S_IWGRP,S_IROTH 和 S_IWOTH 的组合,它们分别对应于用户读,用户写,用户组读,用户组写,其他用户读和其他用户写,因此用文件的访问权限设置是一致的。 module_param(my_invisible_int, int, 0);//第三个参数设置为0,参数不可见 MODULE_PARM_DESC(my_invisible_int, "An invisible int under sysfs");//仅仅是个描述语句。 module_param(my_visible_int, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(my_visible_int, "An visible int under sysfs"); module_param(mystring, charp, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(mystring, "An visible string under sysfs");假设一个模块内部定义如上,那么可以用下面的命令来修改模块内部的可见参数。
$ insmod ./module-param-exam.ko my_invisible_int=10 my_visible_int=20 mystring="Hello,World"//插入模块时设置参数
my_invisible_int = 10
my_visible_int = 20
mystring = 'Hello,World'
$ ls /sys/module/module_param_exam/parameters/ //显示可见的参数
mystring my_visible_int
$ cat /sys/module/module_param_exam/parameters/mystring //显示参数的值
Hello,World
$ cat /sys/module/module_param_exam/parameters/my_visible_int
20
$ echo 2000 > /sys/module/module_param_exam/parameters/my_visible_int //通过管道给参数传值
$ cat /sys/module/module_param_exam/parameters/my_visible_int //显示传值之后的结果
2000
$ echo "abc" > /sys/module/module_param_exam/parameters/mystring
$ cat /sys/module/module_param_exam/parameters/mystring
abc
$ rmmod module_param_exam //退出模块
my_invisible_int = 10
my_visible_int = 2000
mystring = 'abc'
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值