继续编写简单的linux模块 hello

1、通过包含linux/sched.h头文件

#include <linux/sched.h>

可以使用下面的语句打印当前进程的进程 ID 和命令名:

printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);

hello.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
	printk(KERN_INFO "Hello, world\n");
	printk(KERN_INFO "The process is \"%s\" (pid %i)\n", current->comm, current->pid);

	return 0;
}

static void hello_exit(void)
{
	printk(KERN_INFO "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

编译并安装模块:

make

sudo insmod hello.ko 

dmesg查看打印信息:

[17541.464901] Hello, world
[17541.464903] The process is "insmod" (pid 31411)

2、初始化函数声明中通常使用__init 修饰符,它是一个给内核的暗示,给定的函数只是在初始化使用。 模块加载者在模
块加载后会丢掉这个初始化函数,使它的内存可做其他用途。一个类似的标签(__initdata) 给只在初始化时用的数据。

static int __init initialization_function(void)
{
    /* Initialization code here */
}
module_init(initialization_function);

3、清理函数声明中通常使用__exit 修饰符,标识这个代码是只用于模块卸载( 通过使编译器把它放在特殊的 ELF 段)。 如果你的模块直接建立在内核里,或者如果你的内核配置成不允许模块卸载,标识为 __exit 的函数被简单地丢弃。因为这个原因,一个标识 __exit 的函数只在模块卸载或者系统停止时调用,任何别的使用都是错的。

如果你的模块没有定义一个清理函数,内核不会允许它被卸载。

static void __exit cleanup_function(void)
{
/* Cleanup code here */
}
module_exit(cleanup_function);

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值