快速业务通道

Linux 时钟处理机制

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-09

代码解释:

●初始化本 CPU 上的软件时钟相关的数据结构,参见3.2节
●向 cpu_chain 通知链注册元素 timers_nb ,该元素的回调函数用于初始化指定 CPU 上的软件时钟相关的数据结构
●初始化时钟的软中断处理函数
2.3.3 time_init 函数

函数 time_init 的实现如清单2-2


清单2-2 time_init 函数

void __init time_init(void)

{

    ……

    init_tsc_clocksource();

    late_time_init = choose_time_init();

}

函数 init_tsc_clocksource 初始化 tsc 时钟源.choose_time_init 实际是函数 hpet_time_init ,其代码清单2-3


清单2-3 hpet_time_init 函数

Empire CMS,phome.net
void __init hpet_time_init(void)

{

    if (!hpet_enable())

        setup_pit_timer();



    setup_irq(0, &irq0);

}

函数 hpet_enable 检测系统是否可以使用 hpet 时钟,如果可以则初始化 hpet 时钟.否则初始化 pit 时钟.设置硬件时钟发生时的处理函数(参见2.4节).

初始化硬件时钟这个过程主要包括以下两个过程(参见 hpet_enable 的实现):

1初始化时钟源信息( struct clocksource 类型的变量),并将其添加到时钟源链表中,即 clocksource_list 链表(参见图2-1).
2初始化时钟事件设备信息( struct clock_event_device 类型的变量),并向通知链 clockevents_chain 发布通知:一个时钟事件设备要被添加到系统中.在通知(执行回调函数)结束后,该时钟事件设备被添加到时钟事件设备链表中,即 clockevent_devices 链表(参见图2-1).有关通知链的内容参见2.2节.
需要注意的是在初始化时钟事件设备时,全局变量 global_clock_event 被赋予了相应的值.该变量保存着系统中当前正在使用的时钟事件设备(保存了系统当前使用的硬件时钟中断发生时,要执行的中断处理函数的指针).

2.4 硬件时钟处理过程

由2.3.3可知硬件时钟中断的处理函数保存在静态变量 irq0 中,其定义如清单2-4


清单2-4 变量irq0定义

static struct irqaction irq0 = {

	.handler	= timer_event_interrupt,

	.flags		= IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING,

	.mask		= CPU_MASK_NONE,

	.name		= "timer"

};

由定义可知:函数 timer_event_interrupt 为时钟中断处理函数,其定义如清单2-5


清单2-5 timer_event_interrupt 函数

static irqreturn_t timer_event_interrupt(int irq, void *dev_id)

{

    add_pda(irq0_irqs, 1);

    global_clock_event->event_handler(global_clock_event);

    return IRQ_HANDLED;

}

Empire CMS,phome.net

从代码中可以看出:函数 timer_event_interrupt 实际上调用的是 global_clock_event 变量的 event_handler 成员.那 event_handler 成员指向哪里呢?

为了说明这个问题,不妨假设系统中使用的是 hpet 时钟.由2.3.3节可知 global_clock_event 指向 hpet 时钟事件设备( hpet_clockevent ).查看 hpet_enable 函数的代码并没有发现有对 event_handler 成员的赋值.继续查看时钟事件设备加入事件的处理函数 tick_notify ,该函数记录了当时钟事件设备发生变化(例如,新时钟事件设备的加入)时,执行那些操作(参见2.3.1节),代码如清单2-6


清单2-6 tick_notify 函数

static int tick_notify(struct notifier_block *nb, unsigned long reason, void *dev)

{

    switch (reason) {

    case CLOCK_EVT_NOTIFY_ADD:

        return tick_check_new_device(dev);

    ……

    return NOTIFY_OK;

}

由代码可知:对于新

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

上一页1234下一页
分享到: 更多
你可能对下面的文章感兴趣
上一篇: linux常用命令解析下一篇: 11月第3周回顾:45纳米时代来临 Linux利好不断

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号