Linux 时钟处理机制(一)
下文中运行,不允许阻塞
可阻塞通知链( Blocking notifier chains ):通知链元素的回调函数在进程上下文中运行,允许阻塞 原始通知链( Raw notifier chains ):对通知链元素的回调函数没有任何限制,所有锁和保护机制都由调用者维护 SRCU 通知链( SRCU notifier chains ):可阻塞通知链的一种变体 拥有帝国一切,皆有可能。欢迎访问phome.net 对应了四种通知链头结构: struct atomic_notifier_head :原子通知链的链头 struct blocking_notifier_head :可阻塞通知链的链头 struct raw_notifier_head :原始通知链的链头 struct srcu_notifier_head : SRCU 通知链的链头 通知链元素的类型: struct notifier_block :通知链中的元素,记录了当发出通知时,应该执行的操作(即回调函数) 链头中保存着指向元素链表的指针.通知链元素结构则保存着回调函数的类型以及优先级,参见 notifier.h 文件. 2.2.2 运作机制 通知链的运作机制包括两个角色: 被通知者:对某一事件感兴趣一方.定义了当事件发生时,相应的处理函数,即回调函数.但需要事先将其注册到通知链中(被通知者注册的动作就是在通知链中增加一项). 通知者:事件的通知者.当检测到某事件,或者本身产生事件时,通知所有对该事件感兴趣的一方事件发生.他定义了一个通知链,其中保存了每一个被通知者对事件的处理函数(回调函数).通知这个过程实际上就是遍历通知链中的每一项,然后调用相应的事件处理函数. 包括以下过程: 通知者定义通知链 被通知者向通知链中注册回调函数 当事件发生时,通知者发出通知(执行通知链中所有元素的回调函数) 整个过程可以看作是“发布——订阅”模型(参见参考资料) 被通知者调用 notifier_chain_register 函数注册回调函数,该函数按照优先级将回调函数加入到通知链中 .注销回调函数则使用 notifier_chain_unregister 函数,即将回调函数从通知链中删除.2.2.1节讲述的4种通知链各有相应的注册和注销函数,但是他们最终都是调用上述两个函数完成注册和注销功能的.有 兴趣的读者可以自行查阅内核代码. 通知者调用 notifier_call_chain 函数通知事件的到达,这个函数会遍历通知链中所有的元素,然后依次调用每一个的回调函数(即完成通知动作).2.2.1节讲述的4种通知链也都有其对应的 通知函数,这些函数也都是最终调用 notifier_call_chain 函数完成事件的通知. 拥有帝国一切,皆有可能。欢迎访问phome.net 更多关于通知链的内容,参见参考文献. 由以上的叙述,“通知链”技术可以概括为:事件的被通知者将事件发生时应该执行的操作通过函数指针方式保存在链表(通知链)中,然后当事件发生时通知者依次执行链表中每一个元素的回调函数完成通知. 2.3 时钟初始化 内核初始化部分( start_kernel 函数)和时钟相关的过程主要有以下几个: tick_init() init_timers() hrtimers_init() time_init() 其中函数 hrtimers_init() 和高精度时钟相关(本文暂不介绍这部分内容).下面将详细介绍剩下三个函数. 2.3.1 tick_init 函数
函数 tick_init() 很简单,调用 clockevents_register_notifier 函数向 clockevents_chain 通知链注册元素: tick_notifier.这个元素的回调函数指明了当时钟事件设备信息发生变化(例如新加入一个时钟事件设备等等)时,应该执行的操作,该回调函数为 tick_notify (参见2.4节). 2.3.2 init_timers 函数 注:本文中所有代码均来自于Linux2.6.25 源代码 函数 init_timers() 的实现如清单2-1(省略了部分和 主要功能无关的内容,以 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |