notification chain and timer interrupt
2013-08-07 16:24
302 查看
notification chain
Class:
notifier_block
member:
notifier_call: callback function
next:
single list
notifier_block --> notifier_block --> ... --> notifier_block --> notifier_block
four flavors
atomic_notifier_head
blocking_notifier_head
raw_notifier_head
srcu_notifier_head
method:
notifier_chain_register
notifier_chain_unregister
run:
notifier_call_chain
instance:
clockevents_chain
type
raw_notifier_head
method
clockevents_register_notifier
-- raw_notifier_chain_register
-- notifier_chain_register
clockevents_unregister_notifier (x)
raw_notifier_chain_unregister
-- notifier_chain_unregister
run:
clockevents_do_notify
-- raw_notifier_call_chain
-- __raw_notifier_call_chain
-- notifier_call_chain
element:
static struct notifier_block tick_notifier = {
.notifier_call = tick_notify,
};
clockevents_chain
tick_notify <--> watch_notify <--> horologe_notify <--> sun_notify <--> ...
implement:
clockevents_register_device
<-- setup_APIC_timer
<-- setup_pit_timer
<-- hpet_legacy_clockevent_register
instance
cpu_chain
type
raw_notifier_head
method
register_cpu_notifier
unregister_cpu_notifier
cpu_chain
timers_nb <--> amd_cpu_notifier <--> hrtimers_nb <-->
perf_cpu_notify <--> migration_notifier <--> cpucache_notifier <-->
slab_notifier <--> hotplug_cfd_notifier <--> cpu_nfb <--> vmstat_notifier
hardware clock
struct clocksource
clocksource_list
lguest_clock <--> clocksource_hpet <-->
<--> pit_cs <--> clocksource_jiffies <--> kvm_clock <--> xen_clocksource
<--> clocksource_tsc <--> clocksource_uv <--> clocksource_vmi
clocksource_register
clocksource_unregister
struct clock_event_device
clockevent_devices
struct clock_event_device <--> struct clock_event_device <--> struct clock_event_device
event_handler
clock
{
struct clocksource: static
struct clock_event_device: dynamic
}
struct tick_device {
struct clock_event_device *evtdev;
enum tick_device_mode mode;
};
对于tick设备,event_handler 总是被设置为同一个
void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast)
{
if (!broadcast)
/* global_clock_event->event_handler = tick_handle_periodic */
dev->event_handler = tick_handle_periodic;
else
dev->event_handler = tick_handle_periodic_broadcast;
}
time_init
x86_late_time_init
hpet_time_init
hpet_enable
hpet_clocksource_register
clocksource_register(&clocksource_hpet);
hpet_legacy_clockevent_register
clockevents_register_device -- hpet_clockevent
global_clock_event = &hpet_clockevent;
setup_pit_timer
setup_boot_APIC_clock
setup_APIC_timer
clockevents_register_device
x86 arch initialization
x86_init
irq0->handler
= timer_event_interrupt
= global_clock_event->event_handler(global_clock_event);
= tick_handle_periodic
add_timer
mod_timer
internal_add_timer
run_timer_softirq
__run_timers
Class:
notifier_block
member:
notifier_call: callback function
next:
single list
notifier_block --> notifier_block --> ... --> notifier_block --> notifier_block
four flavors
atomic_notifier_head
blocking_notifier_head
raw_notifier_head
srcu_notifier_head
method:
notifier_chain_register
notifier_chain_unregister
run:
notifier_call_chain
instance:
clockevents_chain
type
raw_notifier_head
method
clockevents_register_notifier
-- raw_notifier_chain_register
-- notifier_chain_register
clockevents_unregister_notifier (x)
raw_notifier_chain_unregister
-- notifier_chain_unregister
run:
clockevents_do_notify
-- raw_notifier_call_chain
-- __raw_notifier_call_chain
-- notifier_call_chain
element:
static struct notifier_block tick_notifier = {
.notifier_call = tick_notify,
};
clockevents_chain
tick_notify <--> watch_notify <--> horologe_notify <--> sun_notify <--> ...
implement:
clockevents_register_device
<-- setup_APIC_timer
<-- setup_pit_timer
<-- hpet_legacy_clockevent_register
instance
cpu_chain
type
raw_notifier_head
method
register_cpu_notifier
unregister_cpu_notifier
cpu_chain
timers_nb <--> amd_cpu_notifier <--> hrtimers_nb <-->
perf_cpu_notify <--> migration_notifier <--> cpucache_notifier <-->
slab_notifier <--> hotplug_cfd_notifier <--> cpu_nfb <--> vmstat_notifier
hardware clock
struct clocksource
clocksource_list
lguest_clock <--> clocksource_hpet <-->
<--> pit_cs <--> clocksource_jiffies <--> kvm_clock <--> xen_clocksource
<--> clocksource_tsc <--> clocksource_uv <--> clocksource_vmi
clocksource_register
clocksource_unregister
struct clock_event_device
clockevent_devices
struct clock_event_device <--> struct clock_event_device <--> struct clock_event_device
event_handler
clock
{
struct clocksource: static
struct clock_event_device: dynamic
}
struct tick_device {
struct clock_event_device *evtdev;
enum tick_device_mode mode;
};
对于tick设备,event_handler 总是被设置为同一个
void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast)
{
if (!broadcast)
/* global_clock_event->event_handler = tick_handle_periodic */
dev->event_handler = tick_handle_periodic;
else
dev->event_handler = tick_handle_periodic_broadcast;
}
time_init
x86_late_time_init
hpet_time_init
hpet_enable
hpet_clocksource_register
clocksource_register(&clocksource_hpet);
hpet_legacy_clockevent_register
clockevents_register_device -- hpet_clockevent
global_clock_event = &hpet_clockevent;
setup_pit_timer
setup_boot_APIC_clock
setup_APIC_timer
clockevents_register_device
x86 arch initialization
x86_init
irq0->handler
= timer_event_interrupt
= global_clock_event->event_handler(global_clock_event);
= tick_handle_periodic
add_timer
mod_timer
internal_add_timer
run_timer_softirq
__run_timers
相关文章推荐
- SetTimer and CreateWaitableTimer的例子(静态函数设置为回调函数,瑞士的网页,有点意思)
- ULK --- Chap 4: Nested Execution of Exception and Interrupt Handlers
- 5-Local Notifications and Push Notifications--Provider Communication with Apple Push Notification Service
- Process Context and Interrupt Context
- registerForRemoteNotificationTypes: is not supported in iOS 8.0 and
- iOS iOS8中 问题"registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later" 解决方案
- (转)Creating a GTK notification area icon using Mono and C#
- iOS iOS8中 问题"registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later" 解决方式
- Exception and Interrupts Notes of 80386 Programmer manual
- Get notification texts colors and background
- 定时器与线程的同步-(sync between timer and thead)
- boost asio timer,linux time and timer
- physical interrupt and virtual interrupt
- Chain Splits and Resolutions
- Interrupts and Network Drivers
- x86 exception and interrupt handling
- Creating, configuring, and scheduling a local notification
- Entering the kernel without a driver and getting interrupt information from APIC
- 背后的机制 for notifications on data change: SqlNotificationRequest, SqlDependency and SqlCacheDependency