linux 下编译内核模块(亲测可用哦)

转自:http://www.cnblogs.com/zhanglanyun/archive/2011/11/26/2264406.html

一、 编写一个简单的模块

模块和内核都在内核空间运行,模块编程在一定意义上说就是内核编程。因为内核版本的每次变化,其中的某些函数名也会相应地发生变化,因此模块编程与内核版本密切相关。以下例子针对Ubuntu 9.10  内核2.6.31-14-generic(我在fedora 17 下也可以,请确保你的系统中有内核源码哦!)

 

1.程序举例

hello.c

?
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
MODULE_LICENSE( "GPL" );
static  int  __init lkp_init( void )
{
     printk(KERN_ALERT "Hello World!\n" );
     return  0;
}
static  void  __exit lkp_cleanup( void )
{
     printk(KERN_ALERT "Bye World!\n" );
}
module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_AUTHOR( "heyutao" );
MODULE_DESCRIPTION( "hello" );

 

说明

所有模块都要使用头文件module.h,此文件必须包含进来。
头文件kernel.h包含了常用的内核函数。
头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。
lkp_init是模块的初始化函数,它必需包含诸如要编译的代码、初始化数据结构等内容。
使用了printk()函数,该函数是由内核定义的,功能与C库中的printf()类似,它把要打印的信息输出到终端或系统日志。
lkp_cleanup是模块的退出和清理函数。此处可以做所有终止该驱动程序时相关的清理工作。
module_init()和cleanup_exit()是模块编程中最基本也是必须的两个函数。
module_init()是驱动程序初始化的入口点。而cleanup_exit()注销由模块提供的所有功能。

2  编写Makefile 文件,与hello.c 放在同一个目录里

 

?
obj-m := hello.o
KERNELBUILD :=/lib/modules/$(shell uname -r)/build
default :
     make -C $(KERNELBUILD) M=$(shell pwd) modules #<==============make 前面改成一个tab键(直接复制会把Tab变成空格)
clean:
     rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions #<===rm 前面改成一个tab键(直接复制会把Tab变成空格)

 (注意makefile里面要求的tab,特别注意)

KERNELBUILD :=/lib/modules/$(shell uname -r)/build是编译内核模块需要的Makefile的路径,Ubuntu下是

/lib/modules/2.6.31-14-generic/build

make -C $(KERNELBUILD) M=$(shell pwd) modules 编译内核模块。-C 将工作目录转到KERNELBUILD,调用该目录下的Makefile,并向这个Makefile传递参数M的值是$(shell pwd) modules。

3. 编译模块

#sudo make    (调用第一个命令default)

这时,在hello.c 所在文件夹就会有 hello.ko ,这个就是我们需要的内核模块啦

#sudo make clean

清理编译垃圾,hello.ko 也会清理掉。

4. 插入模块,让其工作。注意必须是root权限

#sudo insmod ./hello.ko
我们用dmesg 就可以看到 产生的内核信息啦,Hello world!

如果没有输出"hello from hello world",因为如果你在字符终端而不是终端模拟器下运行的话,就会输出,因为在终端模拟器下时会把内核消息输出到日志文件/var/log/kern.log中。


#sudo rmmod ./hello
再用dmesg 可以看到 Bye world!

如果在make时报错找不到build目录下的文件

在终端输入 

ls /lib/modules/$(uname -r)/build

如果没有输出或者报错说明你的内核源码没有安装。

我装的是fedora 17 cd版的带有源码,如果没有源码请百度如何安装。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值