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

Linux内核定时器相关内容总结

Linux不可能凭空就有时间基准,那么它是用哪个定时器来作为系统时基?

Linux的时钟系统还是很复杂的,一时半会儿估计捋不清楚。

参考:深度剖析Linux定时器:原理、分类与实践探索 | 《Linux就该这么学》 (linuxprobe.com)

Linux定时器的原理

Linux定时器,即Linux内核所支持的一种时钟调度技术,用于在指定时段或特定时刻自动执行特定任务或函数。其运作机理依赖于操作系统内核的时钟管理体系,通过中断与计时器的协同工作得以实现。Linux内核设有多重定时器队列,各队列分别具备各自的时间分辨率及精度,适配各类定时需求。当定时器预定时间到达之际,内核将自动启动相关处理函数以执行任务。

Linux内核主要包含系统定时器、硬件定时器及软件定时器三类。其中,系统定时器作为核心组件,负责调控整个系统的时间。硬件定时器则与计算机硬件紧密相连,如处理器内置计时器或外置定时器设备等。而软件定时器则为软件模拟的计时器,可通过编程手段进行创建和管理。

系统定时器为Linux内核核心组件,赋予了管理系统时间的重要使命。其涵盖设备种类丰富,含实时时钟linux 常用命令,用以精准计算当下日期与时间;亦包含系统时钟,作为内核内部维护的时钟,精确记录系统运行时间;以及进程时钟,用于追踪进程运行时间,包括用户态及内核态的时间。借助上述时钟,系统定时器得以有效地管理并调度时间,确保系统稳定运行。

接下来分几个部分来说明吧,我们暂且不管时钟源到底来自哪里,这个是系统内核要解决的事情(待解惑:移植Linux时要怎么适配时钟的问题?)。

Linux内核定时器

内核时间管理简介

学习过 UCOS 或 FreeRTOS 的同学应该知道,UCOS 或 FreeRTOS 是需要一个硬件定时器提供系统时钟,一般使用 Systick 作为系统时钟源。同理,Linux 要运行,也是需要一个系统时钟的,至于这个系统时钟是由哪个定时器提供的,笔者没有去研究过 Linux 内核,但是在 CortexA7 内核中有个通用定时器,在《Cortex-A7 Technical ReferenceManua.pdf》的“9:Generic Timer”章节有简单的讲解,关于这个通用定时器的详细内容,可以参考《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》的“chapter B8 The Generic Timer”章节。这个通用定时器是可选的,按照笔者学习 FreeRTOS 和 STM32 的经验,猜测 Linux 会将这个通用定时器作为 Linux 系统时钟源(前提是 SOC 得选配这个通用定时器)。具体是怎么做的笔者没有深入研究过,这里仅仅是猜测!不过对于我们 Linux 驱动编写者来说,不需要深入研究这些具体的实现,只需要掌握相应的 API 函数即可,除非你是内核编写者或者内核爱好者。

Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、定时程序、延时程序等等。

先了解下什么是系统频率。

硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),有的资料也叫系统频率。就相当于freertos中systick的定时频率.硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率,也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍率。系统节拍率是可以设置的,单位是 Hz,我们在编译 Linux 内核的时候可以通过图形化界面设置系统节拍率,按照如下路径打开配置界面:

-> Kernel Features -> Timer frequency (<choice> [=y])

选中“Timer frequency”,打开以后如图 50.1.1.1 所示:

从图 50.1.1.1 可以看出,可选的系统节拍率为 100Hz、200Hz、250Hz、300Hz、500Hz 和1000Hz,默认情况下选择 100Hz。Linux内核从2.5版内核开始把频率从100调高到可支持1000。2.4 中定义为 100,很多应用程序也仍然沿用 100 的时钟频率。

参考:Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解 - 专注it - 博客园 (cnblogs.com)

设置好以后打开 Linux 内核源码根目录下的.config 文件,在此文件中有如图 50.1.1.2 所示定义:

图 50.1.1.2 中的 CONFIG_HZ 为 100,Linux 内核会使用 CONFIG_HZ 来设置自己的系统时钟。打开文件 include/asm-generic/param.h,有如下内容:

第 7 行定义了一个宏 HZ,宏 HZ 就是 CONFIG_HZ,因此 HZ=100,我们后面编写 Linux驱动的时候会常常用到 HZ,因为 HZ 表示一秒的节拍数,也就是频率。

大多数初学者看到系统节拍率默认为 100Hz 的时候都会有疑问,怎么这么小?100Hz 是可选的节拍率里面最小的。为什么不选择大一点的呢?这里就引出了一个问题:高节拍率和低节拍率的优缺点:

①、高节拍率会提高系统时间精度,如果采用 100Hz 的节拍率,时间精度就是 10ms,采用1000Hz 的话时间精度就是 1ms,精度提高了 10 倍。高精度时钟的好处有很多,对于那些对时间要求严格的函数来说,能够以更高的精度运行,时间测量也更加准确。

②、高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担,1000Hz 和 100Hz的系统节拍率相比,系统要花费 10 倍的“精力”去处理中断。中断服务函数占用处理器的时间增加,但是现在的处理器性能都很强大,所以采用 1000Hz 的系统节拍率并不会增加太大的负载压力。根据自己的实际情况,选择合适的系统节拍率,本教程我们全部采用默认的 100Hz 系统节拍率。

一般,这个系统频率也就是Linux时间片调度的频率,也就是1ms或者10ms进行一次任务调度。不过这个频率可能也不仅仅是提供给时间片调度来用的,还用在了其他地方,这个我们暂且不深究。

我们可以利用这个系统频率来做一些定时或者延时等相关的工作。

Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数,系统启动的时候会将 jiffies 初始化为 0,jiffies 定义在文件 include/linux/jiffies.h 中,定义如下:

第 76 行,定义了一个 64 位的 jiffies_64。

第 77 行,定义了一个 unsigned long 类型的 32 位的 jiffies。

jiffies_64 和 jiffies 其实是同一个东西,jiffies_64 用于 64 位系统,而 jiffies 用于 32 位系统。

为了兼容不同的硬件,jiffies 其实就是 jiffies_64 的低 32 位,jiffies_64 和 jiffies 的结构如图50.1.1.3 所示:

当我们访问 jiffies 的时候其实访问的是 jiffies_64 的低 32 位,使用 get_jiffies_64 这个函数可以获取 jiffies_64 的值。在 32 位的系统上读取 jiffies 的值,在 64 位的系统上 jiffes 和 jiffies_64表示同

http://www.jsqmd.com/news/610959/

相关文章:

  • 终极指南:Alacritty极速终端如何完美处理特殊字符与快捷键?
  • 探寻2026年优质变压器:干式变压器厂商推荐指南,变压器/预装式变电站/干式变压器/油浸式变压器,变压器研发企业推荐 - 品牌推荐师
  • 单片机基于TXW8301的Wi-Fi Halow物联网控制
  • OpenClaw环境隔离:用Docker部署Qwen3-4B避免污染主机
  • RF-Diffusion 时频扩散无线电信号生成实验复现
  • 【Android】基于安卓app的健身房会员管理系统(源码+部署方式+论文)[独一无二]
  • 2026年粉体工程混合机技术拐点:智能化升级与全生命周期成本洞察白皮书
  • Arduino IDE内置的ArduinoISP代码详解:从引脚定义到通信协议,搞懂Bootloader烧录原理
  • Linux操作系统--8--操作系统中锁的实现
  • OpenClaw能耗优化:Phi-3-mini-128k-instruct在笔记本上的省电配置
  • 10名学生成绩排名系统详解
  • 轻量级安全助手:在2GB内存设备运行OpenClaw+SecGPT-14B
  • 2026年4月市场上新型的球阀供货厂家有哪些,市面上球阀深度剖析助力明智之选 - 品牌推荐师
  • Redis持久化:从AOF到RDB,如何实现数据不丢失?揽
  • OpenClaw多模型支持:千问3.5-9B与本地模型混用方案
  • Jenkins部署java项目 :构建触发器定时更新
  • OpenClaw多任务并行:Qwen3-14b_int4_awq模型高效调度
  • 终极Flash浏览器指南:如何在现代系统中完美运行Flash游戏与网页
  • OpenClaw+Qwen3.5-9B+VSCode:开发者效率提升套件
  • 从攻击到防御:手把手教你用PHP Prepared Statement修复SQL注入漏洞
  • 2025新范式:nomic-embed-text-v1如何碾压传统嵌入模型?实测数据告诉你答案
  • 自学笔记——集成学习
  • 终极鸣潮自动化指南:10个技巧解放双手,一键完成日常任务与声骸刷取
  • 如何使用node-fetch实现GraphQL批量查询:5个减少请求数量的实用技巧
  • 从System.Device.Gpio到AI推理:.NET 9如何让树莓派5跑通Stable Diffusion XL Lite——嵌入式AI新范式
  • 使用adb调试Android技巧
  • CDH在线扩容问题记录
  • COC部落冲突安卓自动搜鱼:Python脚本防封号实战
  • 2026年4月OpenClaw(Clawdbot)如何搭建?京东云快速流程:部署与大模型API、Skill集成指南
  • 从一次Sigar崩溃看Java生态的‘版本地狱’:如何优雅管理JDK与本地库的兼容性矩阵(附jdk1.8.0_241下载与降级实操)