linux内核模块编程(二)----timer定时器

2023-10-31

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
在这里插入图片描述

一 why

一般地,在我们嵌入式软件开发中,使用定时器的目的是为了实现周期性地执行某项工作;同样地,linux内核也实现了一种定时器,用于实现内核周期性执行某项工作。

二 what

linux内核实现的这种定时器,称之为动态定时器,是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,它的实现位于Linux/timer.h 和 kernel/timer.c 文件中。
被调度的函数是异步执行的,类似于一种“软件中断”,处于非进程的上下文中,所以这个被调度函数应该遵循如下规则

1. 没有 current 指针,不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。
2. 不能执行休眠(或可能引起休眠的函数)和调度。
3. 任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。
4. 被调度函数运行过一次后就不会再被运行了(相当于自动注销),但可以通过在被调度的函数中重新调度自己来周期运行。

2.1 内核定时器的数据结构

struct timer_list {
    struct list_head entry;  // 当一个定时器被注册到内核之后,entry 字段用来连接该定时器到一个内核链表中
    unsigned long expires;   // 表示期望定时器执行的 jiffies 值,到达该 jiffies 值时,将调用 function 函数
    void (*function)(unsigned long);
    unsigned long data; 
    struct tvec_base *base; //内核内部实现所用的
    /* ... */
};

2.2 初始化
由于linux内核版本的不同,关于初始化部分的实现有不同的函数,低版本的用init_timer,高版本是timer_setup

#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
    init_timer(&dev->getIntrTimer);
    dev->getIntrTimer.data = (unsigned long) dev;
    dev->getIntrTimer.function = GetIntrTimerCallback;
    /* ... */
    add_timer(&dev->getIntrTimer);
#else
    timer_setup(&dev->getIntrTimer, GetIntrTimerCallback, 0);
    /* the third argument may include TIMER_* flags */
    /* ... */
#endif

比如当前我的linux版本是4.15,所以在我的实验中,使用的就是timer_setup
2.3 注册
初始化定时器成功之后,我们需要注册该定时器,函数为

add_timer

2.4 修改
定时运行过程中的定时器周期修改函数为

mod_timer

前面我们知道,当定时周期来到时,会执行被调函数,如果我们此时不修改定时器到期时间,则接下来就不会在执行被调函数了,我们可以在被调函数中修改定时器到期时间,实现周期性执行被调函数。

三 how

定时器内核编程示例

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/jiffies.h>


static struct timer_list test_timer;

static void irq_test_timer_function(struct timer_list  *timer)
{
	printk("22 again in irq_test_timer_function\n");
	mod_timer(&test_timer, jiffies + 2 * HZ);
}

static int timer_drv_init(void)
{
	test_timer.expires  = jiffies + 2 * HZ;
	timer_setup(&test_timer, irq_test_timer_function, 0);
	
	add_timer(&test_timer);
	
	printk(KERN_INFO "already init and add timer\n");
	
	return 0;
}

static void timer_drv_exit(void)
{
	printk(KERN_INFO "exit timer drv\n");
	del_timer(&test_timer);
}

module_init(timer_drv_init);
module_exit(timer_drv_exit);
MODULE_LICENSE("GPL");

Makefile文件

obj-m:=test_timer.o

KDIR:= /lib/modules/$(shell uname -r)/build
PWD:= $(shell pwd)

all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean
	

四 test

1. 上传到Ubuntu系统
2. 编译 make
3. 加载 sudo insmod test_timer.ko
4. 查看运行情况 dmesg | tail
5. 卸载 sudo rmmod test_timer

加载时打印
在这里插入图片描述
卸载时打印
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux内核模块编程(二)----timer定时器 的相关文章

  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包

随机推荐

  • 从前端HTML页面提取数据并保存到数据库当中

    前端页面采取form表单的提交方式 form标签中的action属性值为url 规定当提交表单时 向何处发送表单数据 首先把action中的值修改为urls py文件中设置的url method指明提交方式为post 在form表单结束前加
  • 7个案例15分钟让你了解Python套路!

    古人云 书山有路勤为径 学海无涯苦作舟 注 一般标榜着 XX天学会XX XX 分钟了解XX 的文章都不会是让你增长功力的文章 如本文 随着互联网发展 全球在快速数字化 编程这件事也从数十年前只有科研人研在实验室才能做的事变得越来越让人们所熟
  • C++对txt文件的写入读取操作

    文章目录 1 文件流知识 2 文件的写入 3 文件内容的输出 1 文件流知识 摘自c 中文网 ifstream是输入文件流 就是通过它定义的对象获取文件中的内容 ofstream是输出文件流 将内容写入文件 注意 要使用输入输出文件流要包含
  • 1 .SQL——DataGrip 中的DML三种添加数据方法

    insert into student xingx xi id name age grade xb woketime value 1 aa 10 99 男 2023 12 1 给指定字段添加数据 insert into student xi
  • 谷粒商城笔记+踩坑汇总篇

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 设计模式 牛客面试题 目录 一 摘要 二 微服务架构图 三 文章汇总 一 摘要 部
  • 【待解决】报错:gpt模型训练的时候,有报错的torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

    pytorch多GPU并行的问题 torch distributed elastic multiprocessing errors c CSDN博客
  • Goby漏洞更新

    Goby预置了最具攻击效果的漏洞引擎 覆盖Weblogic Tomcat等最严重漏洞 每天从互联网 如CVE 会产生大量的漏洞信息 我们筛选了会被用于真实攻击的漏洞进行每日更新 Goby也提供了可以自定义的漏洞检查框架 发动了互联网的大量安
  • QTreeView使用整理

    在Qt开发过程中 树控件QTreeView使用的非常频繁 各种批量展示和编辑信息的地方 都用得上该控件 在使用QTreeView过程中 用到各种常规 不常规的功能 并进行过各种改造 这里将这些知识和技巧作一个总结 一 Model View框
  • C++实现基于mfc的仓库管理系统(可连MySQL数据库)

    概述 本系统是一个基于mfc实现的可以连接数据库的仓库管理系统 其余管理系统也可根据此系统进行参考与修改进行实现 主要功能 本超市仓库管理系统 通过对数据库的查询 能够实现系统登录以及对商品与用户信息的增删改查操作 支持多用户多身份登录 其
  • 大学《数据库系统》课程设计报告

    二话不说 先怼源码 gitHub源码地址 题 目 教学管理系统 专 业 计算机科学与技术 作 者 马志成 完成时间 2019年1月3日 一 实验目的 数据库系统课程设计是为了配合数据库原理及应用开发而设置的 是计算机科学与技术 网络工程 信
  • Contest2574 - 高级语言程序实践--第6次作业--计信A2107-2113

    写在前面 乍一看挺难 仔细想想也就纸老虎罢了 不写题解 自己想吧 目录 问题 A 字符串去重排序 问题 B 两数之和 问题 C 完美立方数 问题 D 分解质因数 问题 E 子列表最大长度 问题 F 列表的合并与排序 问题 G 个人数据脱敏
  • 别再问我们用什么画图的了!问就是excalidraw

    每次发 https github com tal tech go zero 相关文章时 都会有读者问我们用什么画图的 这图什么工具画的呀 好看 这个手绘风格真好看 用啥工具画的呀 可不可以介绍下这个画图的工具 诸如此类的问题 所以我决定写篇
  • MYSQL 删除空记录 NULL

    数据库小问题 今天在处理数据库中的数据的时候 遇到空记录的问题 在百度上搜索之后 给出的答案有这样几种 1 Delete from student where name null 2 Delete from student where na
  • 不只是噪声,更是数学美 ---浅谈Perlin Noise

    首先说明为什么这篇博客叫这个题目 我刚刚开始学习Perlin Noise是从知乎上的一篇文章入门的 作者的题目是不只是噪声 我觉得很有韵味 就借鉴过来 这是链接 https zhuanlan zhihu com p 22337544 一 背
  • navicat与mysql

    MySQL数据库用于存放数据 客户端navicat是为了方便操作数据库而设计的一种图形化软件 转自知乎如何安装MySQL数据库和navicat客户端 知乎 1 数据库如何安装 MySQL Begin Your Download 官网安装 安
  • MySQL基本知识

    什么是事务 事务是一个独立的工作单元 里面的操作要不全部成功 要不全部失败 事务有什么特性 原子性 操作要不全部成功 要不全部失败 隔离性 多个并发事务之间相互隔离 互不干扰 或者说一个事务的操作对于另外一个事务是不可见的 持久性 事务一旦
  • 密集预测/Dense Prediction

    Pixelwise dense prediction is the task of predicting a label for each pixel in the image 来自于卷积神经网络在图像语义分割 semantic image
  • haproxy应用

    不用手动编译安装 haproxy 1 7 3 tar gz yum install y rpm build rpmbuild help rpmbuild tb haproxy 1 7 3 tar gz cd root rpmbuild RP
  • NLP专栏|图解 BERT 预训练模型!

    关注后 星标 Datawhale 每日干货 每月组队学习 不错过 Datawhale干货 作者 张贤 哈尔滨工程大学 Datawhale原创作者 本文约7000字 NLP专栏文章 建议收藏阅读 审稿人 Jepson Datawhale成员
  • linux内核模块编程(二)----timer定时器

    先给自己打个广告 本人的微信公众号正式上线了 搜索 张笑生的地盘 主要关注嵌入式软件开发 足球等等 希望大家多多关注 有问题可以直接留言给我 一定尽心尽力回答大家的问题 一 why 一般地 在我们嵌入式软件开发中 使用定时器的目的是为了实现