Linux编写一个模块程序,linux 最简单的模块的编写和运行

第一次动手编写一个内核模块,但是查找了许多资料没有一个可以完美通过编译的,郁闷,最后还是解决了,分享出来。

首先是hello.c:

#include /*Needed by all modules*/

#include /*Needed for KERN_* */

#include /* Needed for the macros */

MODULE_LICENSE("GPL");

static int year=2014;

static int hello_init(void)

{

printk(KERN_WARNING "Hello kernel, it's %d!",year);

return 0;

}

static void hello_exit(void)

{

printk("Bye, kernel!");

}

/* main module function*/

module_init(hello_init);

module_exit(hello_exit);

然后是Makefile文件:

#obj-m := name.o表示会编译一个模块(-m),生成的name.o文件来自于name.c文件。

obj-m := hello.o

all:

#uname -r 命令返回的实际就是你现在使用的内核版本

#这里需要注意的是,在shell终端中测试这个命令,不要加shell,即用echo $(uname -r)或者uname -r

#返回的是当前使用的内核版本,其名字可以作为/lib/modules/目录下的一个子目录

#比如我使用的是3.13.0-19-generic,那么-C选项后面完整的路径是:/lib/modules/3.13.0-19-generic/build,

#但是不建议给出具体的路径,而是用$(shell uname -r)这种可变的路径,这样,当你在低版本内核中编译过,

#拿到高版本内核中再次编译的时候也能正常通过。

#这个build通常为链接文件,连接到/usr/src/kernels/3.13.0-19-generic

#确定内核源代码目录通常==文件系统中内核驱动模块的build路径,这也是为什么编译的时候,会出现找不到init.h

#module.h的原因,所以需要指定这个build目录,以指示编译器去寻找需要的头文件。

$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

#命令行下执行make命令,即可得到编译后的模块

#sudo insmod ./hello.ko #加载模块

#sudo rmmod hello #删除模块 或者 sudo rmmod ./hello.ko

#用命令lsmod | grep 'hello'可以看到模块被加载了,但是看不到任何输出

#用tail /var/log/kern.log可以看到执行模块加载和删除时的输出,

#因为模块中输出的信息保存到了系统日志中了

注释写的很清楚了,只要按照步骤来,肯定没问题。至于其中更深层的知识,慢慢体会吧,先让程序通过编译并运行才是最重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值