文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一文搞懂 Linux 时间子系统

2024-12-02 04:54

关注

     1.Secure Physical Timer event (ID 29,也就是上面device node中的13,29 = 16 + 13)

     2.Non-secure Physical Timer event (ID 30,也就是上面device node中的14,30 = 16 + 14)

     3.Virtual Timer event (ID 27)

     4.Hypervisor Timer event (ID 26)

     1.至少 56 bits 的宽度。

     2.频率在 1-50MHz。

     3.溢出时间至少在 40 年。

     4.arm 没有对精度做出特别要求,不过最低的建议值为24小时, 误差不超过 10s。

     5.从 0 开始计数,正常情况下每一个时钟脉冲加1,节能模式下除外。

软件架构

  1. 最底层是硬件和驱动层,每个cpu core都有自己的cpu local timer,此外SOC内部肯定会有一个用于全局的global counter。
  2. 中间层是linux内核层,内核抽象出了时钟源(clocksource), 时钟事件设备(clock_event_device), tick设备(tick_device)用于时间管理。分为左右两部分:
  1. 最上层是linux应用层。基于timekeeping设备的是时间管理的库time lib,基于定时器设备的是定时管理的库timer lib。

数据结构

local timer 的 clocksource 相关的配置信息:

static struct clocksource clocksource_counter = {
 .name = "arch_sys_counter",
 .rating = 400,
 .read = arch_counter_read,
 .mask = CLOCKSOURCE_MASK(56),
 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
};


local timer 的 clock_event_device 相关的配置信息:

static void __arch_timer_setup(unsigned type,
          struct clock_event_device *clk)
{
 clk->features = CLOCK_EVT_FEAT_ONESHOT;

 if (type == ARCH_TIMER_TYPE_CP15) {
  if (arch_timer_c3stop)
   clk->features |= CLOCK_EVT_FEAT_C3STOP;
  clk->name = "arch_sys_timer";
  clk->rating = 450;
  clk->cpumask = cpumask_of(smp_processor_id());
  clk->irq = arch_timer_ppi[arch_timer_uses_ppi];
  switch (arch_timer_uses_ppi) {
    ......
  case ARCH_TIMER_PHYS_NONSECURE_PPI:
  case ARCH_TIMER_HYP_PPI:
   clk->set_state_shutdown = arch_timer_shutdown_phys;
   clk->set_state_oneshot_stopped = arch_timer_shutdown_phys;
   clk->set_next_event = arch_timer_set_next_event_phys;
   break;
  default:
   BUG();
  }
}


system counter 的 clock_event_device 相关的配置信息如下所示,充当硬件timer,当CPU进入idle后用来唤醒CPU。

static struct clock_event_device clockevent_sysctr = {
 .name   = "i.MX system counter timer",
 .features  = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_DYNIRQ,
 .set_state_oneshot = sysctr_set_state_oneshot,
 .set_next_event  = sysctr_set_next_event,
 .set_state_shutdown = sysctr_set_state_shutdown,
 .rating   = 200,
};


struct tick_device {
 struct clock_event_device *evtdev;
 enum tick_device_mode mode;
};


tick device的工作模式定义如下:

enum tick_device_mode {
    TICKDEV_MODE_PERIODIC,
    TICKDEV_MODE_ONESHOT,
};


static struct tick_device tick_broadcast_device;


local timer 驱动

system counter 驱动

system counter 驱动

当没有进程调度到该 CPU 上执行的时候,swapper进程会将该 CPU 推入到 idle 状态。当 CPU 睡的时候,有可能会关闭 local timer 硬件。这就会导致 local timer 将无法唤醒 CPU。

为了在 CPU 进入 idle 后还能被唤醒,有两种方案,一种是通过hrtimer的软件方案,还有一种是硬件方案。这里只讲述硬件方案,一般采用 alway-on 的硬件 timer 作为唤醒源,它不属于任何 CPU,使用 SPI 类型的中断来唤醒 CPU,处理软件 timer。

来源:Linux学习内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯