Linux不可能凭空就有时间基准,那么它是用哪个定时器来作为系统时基?
Linux的时钟系统还是很复杂的,一时半会儿估计捋不清楚。
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 倍。高精度时钟的好处有很多,对于那些对时间要求严格的函数来说,能够以更高的精度运行,时间测量也更加准确。
②、高节拍率会导致中断的产生更加频繁ÿ