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可以看到执行模块加载和删除时的输出,
#因为模块中输出的信息保存到了系统日志中了

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


你可能感兴趣的:(Linux学习)