Linux内核模块实例

一个简单的内核模块来读取 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容