编写内核模块

helloworld.c
#define MODULE
#include <linux/module.h>

int init_module(void)
{
 printk(“<1> Hello World!\n”);
 return 0;
}

void cleanup_module(void)
{
 printk(“ <1>Goodbye!\n”);
}
MODULE_LICENSE(“GPL”);

说明:
1. 代码的第一行#define MODULE首先明确这是一个模块。任何模块程序的编写都需要包含linux/module.h这个头文件,这个文件包含了对模块的结构定义以及模块的版本控制。文件里的主要数据结构我们会在后面详细介绍。
2. 函数init_module()和函数cleanup_module( )是模块编程中最基本的也是必须的两个函数。init_module()向内核注册模块所提供的新功能;cleanup_module()负责注销所有由模块注册的功能。
3. 注意我们在这儿使用的是printk()函数(不要习惯性地写成printf),printk()函数是由Linux内核定义的,功能与printf相似。字符串<1>表示消息的优先级,printk()的一个特点就是它对于不同优先级的消息进行不同的处理,之所以要在这儿使用高优先级,是因为默认优先级的消息可能不能显示在控制台上。这个问题我们就不详细讲了,你可以用man命令寻求帮助。

接下来,我们就要编译和加载这个模块了。在前面的章节里我们已经学习了如何使用gcc,现在还要注意的一点就是:确定你现在是超级用户。因为只有超级用户才能加载和卸载模块。在编译内核模块前,先准备一个Makefile文件:
TARGET = helloworld
KDIR = /usr/src/linux
PWD = $(shell pwd)
obj-m += $(TARGET).o
default:
 make -C $(KDIR) M=$(PWD) modules

然后简单输入命令make:
#make

结果,我们得到文件“helloworld.ko”。然后执行内核模块的装入命令:
#insmod  helloworld.ko
Hello World!
这个时候,看到了打印在屏幕上的“Hello World!”,它是在init_module()中定义的。由此说明,helloworld模块已经加载到内核中了。我们可以使用lsmod命令查看。lsmod命令的作用是告诉我们所有在内核中运行的模块的信息,包括模块的名称,占用空间的大小,使用计数以及当前状态和依赖性。
root# lsmod
Module    Size    Used  by
helloworld  464    0   (unused)

最后,我们要卸载这个模块。
# rmmod helloworld
Goodbye!

转载于:https://www.cnblogs.com/fishert/archive/2008/04/23/1167942.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值