当前位置: 首页 > news >正文

时间记录内核模块

好的,下面是一个示例内核模块的代码,它每隔一秒打印一次当前时间,并在 /proc 文件系统中提供一个接口来查看这些时间记录。

内核模块代码

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#include <linux/seq_file.h>
#include <linux/jiffies.h>#define PROC_ENTRY_NAME "time_logger"static struct proc_dir_entry *proc_file;
static struct timer_list my_timer;
static char time_buffer[256];
static size_t buffer_size = 0;static void timer_callback(struct timer_list *timer) {struct timeval tv;struct tm tm;char time_str[64];size_t len;// Get the current timedo_gettimeofday(&tv);time_to_tm(tv.tv_sec, 0, &tm);// Format the time stringlen = snprintf(time_str, sizeof(time_str), "%04d-%02d-%02d %02d:%02d:%02d\n",tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,tm.tm_hour, tm.tm_min, tm.tm_sec);// Append to the bufferif (buffer_size + len < sizeof(time_buffer)) {memcpy(time_buffer + buffer_size, time_str, len);buffer_size += len;}// Print time to kernel logprintk(KERN_INFO "Current time: %s", time_str);// Re-schedule the timermod_timer(&my_timer, jiffies + msecs_to_jiffies(1000));
}static int proc_show(struct seq_file *m, void *v) {seq_printf(m, "%s", time_buffer);return 0;
}static int proc_open(struct inode *inode, struct file *file) {return single_open(file, proc_show, NULL);
}static const struct file_operations proc_fops = {.owner = THIS_MODULE,.open = proc_open,.read = seq_read,.release = single_release,
};static int __init time_logger_init(void) {// Initialize the timertimer_setup(&my_timer, timer_callback, 0);mod_timer(&my_timer, jiffies + msecs_to_jiffies(1000));// Create proc entryproc_file = proc_create(PROC_ENTRY_NAME, 0, NULL, &proc_fops);if (!proc_file) {printk(KERN_ERR "Failed to create proc entry\n");del_timer(&my_timer);return -ENOMEM;}printk(KERN_INFO "Time logger module loaded\n");return 0;
}static void __exit time_logger_exit(void) {// Remove the proc entryremove_proc_entry(PROC_ENTRY_NAME, NULL);// Delete the timerdel_timer(&my_timer);printk(KERN_INFO "Time logger module unloaded\n");
}module_init(time_logger_init);
module_exit(time_logger_exit);MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("A kernel module that logs time every second and provides it through /proc");
MODULE_AUTHOR("Your Name");

代码说明

  1. 定时器:使用内核定时器 timer_setup 来每隔一秒执行 timer_callback 函数。这个函数会获取当前时间、格式化成字符串并保存到 time_buffer 中,同时将时间打印到内核日志中。

  2. /proc 文件系统:创建 /proc/time_logger 文件,用户可以通过读取这个文件来查看时间记录。文件的读取操作由 proc_show 函数处理,它将 time_buffer 的内容输出到用户空间。

  3. 模块加载与卸载:在 time_logger_init 中初始化定时器和 /proc 文件;在 time_logger_exit 中删除 /proc 文件和定时器。

使用

  1. 编译并加载模块:

    make
    sudo insmod time_logger.ko
    
  2. 查看 /proc/time_logger 文件:

    cat /proc/time_logger
    
  3. 卸载模块:

    sudo rmmod time_logger
    

请确保你的开发环境设置正确,并且内核模块编程已启用。根据需要调整时间格式或其他细节。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【AI/算法类】OPPO 2025届秋招笔试题(B卷)
  • OpenCV的编译(MinGW)
  • 大模型是如何升级的呢?技术?应用?
  • 微信小程序开发:基础架构与配置文件
  • opencv 控制鼠标键盘实现功能setMouseCallback
  • 江科大/江协科技 STM32学习笔记P24
  • 北京城市图书馆-非遗文献馆:OLED透明拼接屏的璀璨应用
  • 探索Witin-NN Tools量化开源项目:模拟神经网络映射映射到存内芯片的计算过程
  • phpmailer如何配置SSL以发送安全电子邮件?
  • Qt表格设置列宽
  • 阿贝云免费虚拟主机和免费云服务器评测
  • 【Leetcode 884 】 两句话中的不常见单词 —— 更简洁的手法
  • redis I/O复用机制
  • 【已解决】CentOS离线安装docker和docker-compose
  • 【Vue3】嵌套路由
  • C++类的相互关联
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java面向对象及其三大特征
  • oldjun 检测网站的经验
  • PHP 的 SAPI 是个什么东西
  • rabbitmq延迟消息示例
  • Vultr 教程目录
  • zookeeper系列(七)实战分布式命名服务
  • 区块链将重新定义世界
  • 听说你叫Java(二)–Servlet请求
  • 怎么将电脑中的声音录制成WAV格式
  • 正则表达式小结
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 回归生活:清理微信公众号
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • $refs 、$nextTic、动态组件、name的使用
  • (1)Hilt的基本概念和使用
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Java数据结构)ArrayList
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***监测系统的构建(chkrootkit )
  • ... 是什么 ?... 有什么用处?
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Core中的去虚
  • .NET 发展历程
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • []C/C++读取串口接收到的数据程序
  • [2018-01-08] Python强化周的第一天
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [Android] Upload package to device fails #2720
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [C# WPF] 如何给控件添加边框(Border)?
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件