美文网首页
Linux内核模块实例

Linux内核模块实例

作者: 勤奋的大头怪 | 来源:发表于2018-01-27 16:31 被阅读0次

    一个简单的内核模块来读取 timespec 数据结构的数据。
    "read_kernel_time.c":

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/timekeeping.h>
    
    struct timespec ts;
    
    static int __init init_k_time(void)
    {
        printk(KERN_INFO "Get kernel time:\n");
        ts = current_kernel_time();
        printk(KERN_INFO "ts->tv_sec: %ld\t ts->tv_nsec: %ld\n", ts.tv_sec, ts.tv_nsec);
        return 0;
    }
    
    static void __exit exit_k_time(void)
    {
        printk(KERN_INFO "Exit\n");
    }
    
    module_init(init_k_time);
    module_exit(exit_k_time);
    MODULE_LICENSE("GPL");
    

    "Makefile":

    obj-m := read_kernel_time.o
    
    all:
        make -C /lib/modules/`uname -r`/build M=$(PWD) modules
    clean:
        make -C /lib/modules/`uname -r`/build M=$(PWD) clean
    

    依赖的编译包:gcc, make, kernel-devel.
    特殊情况,在fedora下,默认系统里没有kernel-devel包,如果此时安装的话,版本会比当前的kernel版本高,此时编译时会出现类似这样的错误:

    make[1]: *** /lib/modules/4.14.13-200.fc26.x86_64/build: No such file or directory.  Stop.
    make: *** [Makefile:4: all] Error 2
    

    错误就是当前kernel版本是"4.14.13-200.fc26",但是直接用"dnf install kernel-devel"安装的版本是"4.14.14-200.fc26"。这种情况下可以用下面的命令来安装:
    sudo dnf install "kernel-devel-uname-r == $(uname -r)"

    Reference:
    Hello, World (part 1): The Simplest Module
    yum-installs-kernel-devel-different-from-my-kernel-version

    相关文章

      网友评论

          本文标题:Linux内核模块实例

          本文链接:https://www.haomeiwen.com/subject/oegnaxtx.html