如何构建Linux内核模块以计算展示秒数、jiffies并通过cat /proc输出
实现步骤
1. 替换simple.c代码
你需要在内核模块中加入proc文件系统的注册逻辑,使用内核标准的seq_file接口实现读取时的输出逻辑,完整代码如下:
/** * simple.c * 内核模块,通过/proc接口输出当前jiffies和系统运行秒数 * 编译执行make即可 */ #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> #include <linux/jiffies.h> #include <linux/time.h> // 定义proc文件的名称,读取路径为/proc/jiffies_stats #define PROC_FILE_NAME "jiffies_stats" /* proc文件的show回调,执行cat时会触发执行 */ static int jiffies_show(struct seq_file *m, void *v) { // 计算系统启动到当前的秒数,HZ为内核配置的每秒jiffies计数 unsigned long seconds = jiffies / HZ; // 输出jiffies和秒数 seq_printf(m, "当前jiffies值: %lu\n系统运行秒数: %lu\n", jiffies, seconds); return 0; } /* open回调,绑定show函数 */ static int jiffies_open(struct inode *inode, struct file *file) { return single_open(file, jiffies_show, NULL); } /* proc文件操作算子集合 */ static const struct proc_ops jiffies_proc_ops = { .proc_open = jiffies_open, .proc_read = seq_read, .proc_lseek = seq_lseek, .proc_release = single_release, }; /* 模块加载时执行 */ static int __init simple_init(void) { printk(KERN_INFO "加载jiffies统计模块\n"); // 创建proc入口,权限0644,父节点为NULL即直接在/proc根目录下创建 proc_create(PROC_FILE_NAME, 0644, NULL, &jiffies_proc_ops); return 0; } /* 模块卸载时执行 */ static void __exit simple_exit(void) { // 删除proc入口 remove_proc_entry(PROC_FILE_NAME, NULL); printk(KERN_INFO "卸载jiffies统计模块\n"); } module_init(simple_init); module_exit(simple_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Jiffies Stats Proc Module"); MODULE_AUTHOR("SGG");
2. Makefile无需修改
你原有提供的Makefile可以直接使用,无需调整:
obj-m += simple.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
注意:Makefile中make命令前必须是Tab缩进,不能是空格。
3. 编译与测试步骤
- 先安装对应内核头文件:
sudo apt install linux-headers-$(uname -r)(Debian/Ubuntu系,其他发行版对应安装内核开发包即可) - 执行
make编译模块 - 加载模块:
sudo insmod simple.ko - 测试输出:
cat /proc/jiffies_stats,就能看到jiffies和秒数的输出 - 卸载模块:
sudo rmmod simple
内容的提问来源于stack exchange,提问作者fateme taheri
相关产品推荐
相关产品推荐

