SlideShare une entreprise Scribd logo
1  sur  111
Télécharger pour lire hors ligne
1
Ch15 Time Management
2
*. Introduction
*. Hardware Timer Mode
*. SMP Timer Framework with 1 Processor
*. SMP Timer Framework with 2 Processors
*. Low/High Resolution Timer Base
3
0ms
10ms
100HZ
4
0ms
10ms
1ms
100HZ
5
0ms
10ms
1ms
100HZ
hw timer interrupt:
執行過期 timer 的 callback func.
6
0ms
10ms
1ms
100HZ
hw timer interrupt:
執行過期 timer 的 callback func.
7
0ms
5ms
10ms
1ms
100HZ
200HZ
hw timer interrupt:
執行過期 timer 的 callback func.
8
0ms
5ms
10ms
4ms
1ms
100HZ
200HZ
250HZ
hw timer interrupt:
執行過期 timer 的 callback func.
9
0ms
5ms
10ms
4ms
2ms
1ms
100HZ
200HZ
250HZ
500HZ
hw timer interrupt:
執行過期 timer 的 callback func.
10
0ms
5ms
10ms
4ms
2ms
1ms
hw timer interrupt:
執行過期 timer 的 callback func.
100HZ
200HZ
250HZ
500HZ
1000HZ
11
0ms
4ms
1ms
根據 timer 設定的觸發時間
設定下一個 hw timer interrupt
250HZ
1ms
3ms
4ms
12
hw timer
hw timer
(virtual)
hw timer hw timer
發生 hw timer interrupt
執行過期 timer 的 callback func.
low res. framework
根據 timer 設定的觸發時間
設定下一個 hw timer interrupt
highres. framework
clockevent clocksource clockevent clocksource
high res. base
high res. base
low res. base
18
*. Introduction
*. Hardware Timer Mode
*. SMP Timer Framework with 1 Processor
*. SMP Timer Framework with 2 Processors
*. Low/High Resolution Timer Base
19
hw timer cycle
set
oneshot
20
hw timer cycle
set
hw timer cycle
set set set set
oneshot
oneshot 用法之一
21
hw timer cycle
set
hw timer cycle
set set set set
hw timer cycle
set set set set
oneshot
oneshot 用法之一
oneshot 用法之二
22
hw timer cycle
set
hw timer cycle
set set set set
hw timer cycle
set set set set
hw timer cycle
set
oneshot
periodic
oneshot 用法之一
oneshot 用法之二
23
hw timer cycle
set
hw timer cycle
set set set set
hw timer cycle
set set set set
hw timer cycle
set
oneshot
periodic
oneshot 用法之一
oneshot 用法之二
low res. clockevent
high res. clockevent
low res. clockevent
clock_event_device
set_next_event
clockevent_timer
name
rating
irq
list
300
event_handler
24
hw timer cycle
set
hw timer cycle
set set set set
hw timer cycle
set set set set
hw timer cycle
set
hw timer cycle
set
25
hw timer cycle
set
hw timer cycle
set set set set
hw timer cycle
set set set set
hw timer cycle
set
hw timer cycle
set
jiffies
26
hw timer cycle
set
hw timer cycle
set set set set
hw timer cycle
set set set set
hw timer cycle
set
hw timer cycle
set
jiffies
clocksource
kernel default
clocksource
clocksource
read
clocksource_timer
name
list
rating
flags
27
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
200
CLOCK_SOURCE_IS_CONTINUOUSflags
jiffies
jiffies_64
tick
xtime
wall
time
28
hw timer cycle
interrupt
interrupt
interrupt
interrupt
interrupt
如果 hw timer 可以同時做到
1. 發出 interrupt
2. 遞增 cycle
那它就可以同時用作 clockevent/clocksource
( 我們不是這 case)
( 而是各自準備一個 hw timer)
interrupt
31
*. Introduction
*. Hardware Timer Mode
*. SMP Timer Framework with 1 Processor
*. SMP Timer Framework with 2 Processors
*. Low/High Resolution Timer Base
32
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
arm
watch
dog
piu
timer1
33
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
flags
200
CLOCK_SOURCE_IS_CONTINUOUS
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
只有這兩個是我們準備的
其它是 kernel 提供
arm
watch
dog
piu
timer1
34
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
interrupt
kernel 收到 timer interrupt:
35
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
interrupt
1. 更新 jiffies_64
kernel 收到 timer interrupt:
36
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
interrupt read cycle
1. 更新 jiffies_64
2. 更新 xtime
kernel 收到 timer interrupt:
37
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
interrupt
high res. base
read cycle
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
kernel 收到 timer interrupt:
38
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
interrupt
high res. base
read cycle
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
kernel 收到 timer interrupt:
39
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
low res. base
interrupt
high res. base
read cycle
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
kernel 收到 timer interrupt:
40
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
low res. base
interrupt
high res. base
read cycle
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
kernel 收到 timer interrupt:
41
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
low res. base
interrupt
high res. base
read cycle
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
kernel 收到 timer interrupt:
在 low res. framework 時
low/high res. base 已可運作
意義上沒有差異
都是定期去檢查有無過期 timer
42
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
read cycle
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
kernel 收到 timer interrupt:
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
interrupt
43
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
read cycle
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
interrupt
44
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
read cycle
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
CLOCK_SOURCE_IS_CONTINUOUS
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
flags
200
interrupt
45
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
read cycle
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
CLOCK_SOURCE_IS_CONTINUOUS
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
flags
200
interrupt
46
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler hrtimer_interrupt
interrupt
47
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
1. 執行過期的 hrtimer
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler hrtimer_interrupt
high res. baseinterrupt
48
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
1. 執行過期的 hrtimer
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler hrtimer_interrupt
high res. base
6. 重新加入 hrtimer base
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 timer
4. 執行 scheduler
5. 設定此 hrtimer 在 10ms 後觸發
interrupt
49
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
1. 執行過期的 hrtimer
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler hrtimer_interrupt
high res. base
6. 重新加入 hrtimer base
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 timer
4. 執行 scheduler
low res. base
5. 設定此 hrtimer 在 10ms 後觸發
interrupt
read cycle
50
arm
global
timer
arm
private
timer
piu
timer0
jiffies
(virtual)
arm
private
timer
1. 執行過期的 hrtimer
2. 設定”多久之後發出下一個 interrupt”
kernel 收到 timer interrupt:
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler hrtimer_interrupt
high res. base
6. 重新加入 hrtimer base
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 timer
4. 執行 scheduler
low res. base
5. 設定此 hrtimer 在 10ms 後觸發
interrupt
read cycle
51
low res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
*. 執行過期的 hrtimer
*. 執行過期的 timer
high res. low res.
52
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
*. 原來部份工作包裝成 hrtimer
*. 設定 hw timer” 多久之後發出下一個 interrupt”
high res. low res.
53
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
high res. low res.
10ms
54
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
*. 移除 hrtimer
*. 執行 hrtimer
--> 執行原來部份工作
--> 設定 10ms 後觸發
*. 重新加回 hrtimer base
*. 設定 clk evt 10ms 後觸發
( 模擬原來 100Hz)
high res. low res.
10ms
55
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
high res. low res.
10ms
56
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
*. 移除 hrtimer
*. 執行 hrtimer
--> 執行原來部份工作
--> 設定 10ms 後觸發
*. 重新加回 hrtimer base
*. 設定 clk evt 10ms 後觸發
( 模擬原來 100Hz)
high res. low res.
10ms
57
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
expires
node
hrtimer
function
node
node
expires
*. 移除 hrtimer
*. 執行 hrtimer
--> 執行原來部份工作
--> 設定 10ms 後觸發
*. 重新加回 hrtimer base
*. 設定 clk evt 10ms 後觸發
( 模擬原來 100Hz)
high res. low res.
10ms
58
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
expires
node
hrtimer
function
node
node
expires
*. 移除 hrtimer
*. 執行 hrtimer
--> 執行原來部份工作
--> 設定 10ms 後觸發
*. 重新加回 hrtimer base
*. 設定 clk evt 3ms 後觸發
( 模擬原來 100Hz)
high res. low res.
10ms
59
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
expires
node
hrtimer
function
node
node
expires
high res. low res.
3ms
60
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
hrtimer
function
node
expires
node
*. 移除 hrtimer
*. 執行 hrtimer
--> 執行任務
--> 設定 10ms 後觸發
*. 重新加回 hrtimer base
*. 設定 clk evt 7ms 後觸發
high res. low res.
3ms
61
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
7ms
high res. low res.
62
low res.
framework
high res.
framework
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
*. 移除 hrtimer
*. 執行 hrtimer
--> 執行原來部份工作
--> 設定 10ms 後觸發
*. 重新加回 hrtimer base
*. 設定 clk evt 10ms 後觸發
( 模擬原來 100Hz)
high res. low res.
7ms
63
*. Introduction
*. Hardware Timer Mode
*. SMP Timer Framework with 1 Processor
*. SMP Timer Framework with 2 Processors
*. Low/High Resolution Timer Base
64
cpu1cpu0
DRAM
DRAM
Physical Address
0x00000000
SPI
waitinit hw
65
cpu1cpu0
DRAM
DRAM
Physical Address
0x00000000
SPI
wait
copy
66
cpu1cpu0
DRAM
DRAM
Physical Address
0x00000000
SPI
wait
init hw &
interrupt cpu1 &
load kernel &
67
cpu1cpu0
DRAM
DRAM
Physical Address
0x00000000
SPI
wait
init hw &
interrupt cpu1 &
load kernel &
68
cpu1cpu0
DRAM
DRAM
Physical Address
0x00000000
SPI
waitinit hw &
interrupt cpu1 &
load kernel &
69
cpu1cpu0
DRAM
DRAM
Physical Address
0x00000000
SPI
waitinit hw &
interrupt cpu1 &
load kernel &
70
cpu1cpu0
PA
0x00000000
wait
start kernel
VA
78
cpu1cpu0
PA
0x00000000
VA
low res. base
high res. base
79
cpu1cpu0
PA
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
80
cpu1cpu0
PA
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
81
irq_desc[0]
action
irq_desc[96]
action
irq_desc[128]
action
irq_desc[255]
action
irqaction
handler
timer_irq
dev_id
name
timer_interrupt
“timer”
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler
irq_desc[29]
action
tick_handle_periodic
82
irq_desc[0]
action
irq_desc[96]
action
irq_desc[128]
action
irq_desc[255]
action
irqaction
handler
timer_irq
dev_id
name
timer_interrupt
“timer”
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler
irq_desc[29]
action
tick_handle_periodicclockevents_handle_noop
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
83
cpu1cpu0
PA
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
84
cpu1cpu0
PA
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
85
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
PA
0x00000000
VA
86
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
PA
0x00000000
VA
87
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
PA
0x00000000
VA
88
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
PA
0x00000000
VA
89
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu1 啟用 mmu
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
90
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
clock event device
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu1 啟用 mmu
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
91
cpu1cpu0
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
clock event device
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
92
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
clock event device
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu1 啟用 mmu
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
93
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
cpu1cpu0
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock source
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
clock event device
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
200
CLOCK_SOURCE_IS_CONTINUOUSflags
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu0 讓 cpu1 離開 loop
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
*. cpu0 把 key/addr 寫到指定位置
*. cpu1 確認 key 之後前往 addr & loop
*. cpu0 為 cpu1 準備 low/high res. base
*. cpu1 啟用 mmu
*. cpu1 自己準備 clockevent
*. cpu1 等著被 scheduler 分配工作
*. 切換 clocksource
94
cpu1cpu0
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
clock event device
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
clock source
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
200
CLOCK_SOURCE_IS_CONTINUOUSflags
95
irq_desc[0]
action
irq_desc[96]
action
irq_desc[128]
action
irq_desc[255]
action
irqaction
handler
timer_irq
dev_id
name
timer_interrupt
“timer”
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler
irq_desc[29]
action
tick_handle_periodicclockevents_handle_noop
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
96
tick_handle_periodic
irq_desc[0]
action
irq_desc[96]
action
irq_desc[128]
action
irq_desc[255]
action
irqaction
handler
timer_irq
dev_id
name
timer_interrupt
“timer”
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
irq_desc[29]
action
clockevents_handle_noop
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler hrtimer_interrupt
97
cpu1cpu0
0x00000000
VA
low res. base
high res. base
clock event device
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
low res. base
high res. base
clock event device
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler tick_handle_periodic
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
7. 設定”多久之後發出下一個 interrupt”
每秒 100 次的頻率做以下事情
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 hrtimer
4. 檢查可否切換至 high res. framework
5. 執行過期的 timer
6. 執行 scheduler
7. 設定”多久之後發出下一個 interrupt”
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
clock source
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
200
CLOCK_SOURCE_IS_CONTINUOUSflags
100
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
tick_sched_timer
cpu1cpu0
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
node
node
expires
functionfunction
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 timer
4. 執行 scheduler
5. 設定此 hrtimer 下次觸發時間 (10ms 後 )
( 藉此達到原本的”每秒 100 次的頻率” )
6. 重新加入 hrtimer base
1. 更新 jiffies_64
2. 更新 xtime
3. 執行過期的 timer
4. 執行 scheduler
5. 設定此 hrtimer 下次觸發時間 (10ms 後 )
( 藉此達到原本的”每秒 100 次的頻率” )
6. 重新加入 hrtimer base
101
cpu1cpu0
low res.
framework
high res.
framework
low res.
framework
high res.
frameworktick emulation
103
*. Introduction
*. Hardware Timer Mode
*. SMP Timer Framework with 1 Processor
*. SMP Timer Framework with 2 Processors
*. Low/High Resolution Timer Base
104
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
105
BOOTTIME MONOTONIC REALTIME
running
suspend
running
減去 sleeping time
加上 adjustment
ex: 1970/05/01 ex: 2013/05/01ex: 1970/05/02
1970/01/01 + ns
106
running
suspend
running
xtime
total_sleep_time
wall_to_monotic
BOOTTIME MONOTONIC REALTIME
ex: 1970/05/01 ex: 2013/05/01ex: 1970/05/02
1970/01/01 + ns
107
clock_base[MONOTONIC]
active
rb_node
head
httimer_cpu_base
clock_base[REALTIME]
active
rb_node
head
clock_base[BOOTTIME]
active
rb_node
head
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
hrtimer
function
node
node
expires
我們 kernel 進 console 前
用不到 5 個 hrtimer
都是 MONOTONIC base
108
tvec_base
boot_tvec_bases
vec[0]
vec[??]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
vec[???]
tv1
vec[0]
vec[??]
vec[63]
tv2
vec[0]
vec[??]
vec[63]
tv3
vec[0]
vec[??]
vec[63]
tv4
vec[0]
vec[??]
vec[63]
tv5
vec[??]
vec[???]
vec[???]
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
109
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv1
256 * tick = 256 tick = 2.56 秒
tick
110
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2tv1
tick 256 tick
64 * 256 tick = 2^14 tick ~= 2.73 分鐘
256 * tick = 256 tick = 2.56 秒
111
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2tv1
tick
64 * 256 tick
= 2^14 tick
~= 2.73 分鐘
256 * tick = 256 tick = 2.56 秒
vec[0]
vec[1]
vec[2]
tv3
64 * 2^14 tick = 2^20 tick ~= 2.91 小時
2^14 tick
112
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2tv1
tick
64 * 256 tick
= 2^14 tick
~= 2.73 分鐘
256 * tick = 256 tick = 2.56 秒
vec[0]
vec[1]
vec[2]
tv3
64 * 2^14 tick
= 2^20 tick
~= 2.91 小時
vec[0]
vec[1]
vec[2]
tv4
64 * 2^20 tick
= 2^26 tick
~= 7.77 天
2^20 tick
113
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2tv1
tick
64 * 256 tick
= 2^14 tick
~= 2.73 分鐘
256 * tick = 256 tick = 2.56 秒
vec[0]
vec[1]
vec[2]
tv3
64 * 2^14 tick
= 2^20 tick
~= 2.91 小時
vec[0]
vec[1]
vec[2]
tv4
64 * 2^20 tick
= 2^26 tick
~= 7.77 天
vec[0]
vec[1]
vec[2]
tv52^26 tick
64 * 2^26 tick
= 2^32 tick
~= 1.36 年
114
tv2
vec[0]
vec[1]
vec[2]
tv3
vec[0]
vec[1]
vec[2]
tv4
vec[0]
vec[1]
vec[2]
tv5
vec[0]
vec[1]
vec[2]
tv1
vec[0]
vec[1]
vec[2]
vec[255]
timer_list
entry
function
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
115
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
timer_list
entry
function
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
116
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
timer_list
entry
function
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
timer_list
entry
function
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
117
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
timer_list
entry
function
timer_list
entry
function
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
118
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
timer_list
entry
function
timer_list
entry
function
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
119
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
timer_list
entry
function
timer_list
entry
function
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
120
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
121
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
122
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
123
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
124
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
(tv2 執行完一輪就從 tv3 補充 )
125
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[0]
vec[1]
vec[2]
vec[255]
vec[??]
vec[??]
vec[???]
vec[???]
vec[???]
tv2 tv3 tv4 tv5tv1
1. 根據 jiffies%256
去執行 tv1 裡對應的 timer(s)
2. tv1 執行完一輪就從 tv2 補充
(tv2 執行完一輪就從 tv3 補充 )
(tv3 執行完一輪就從 tv4 補充 )
(tv4 執行完一輪就從 tv5 補充 )
126
hw timer
hw timer
(virtual)
hw timer hw timer
發生 hw timer interrupt
執行過期 timer 的 callback func.
low res. framework
根據 timer 設定的觸發時間
設定下一個 hw timer interrupt
highres. framework
clockevent clocksource clockevent clocksource
high res. base
high res. base
low res. base
127
clock_event_device
set_next_event
clockevent_timer
timer_set_next_event
name
rating
irq
list
“timer0”
300
E_FIQ_EXTIMER0
event_handler tick_handle_periodic
piu
timer0
clocksource
read
clocksource_jiffies
jiffies_read
name
list
rating
“jiffies”
1
flags
jiffies
(virtual)
clock_event_device
set_next_event
percpu_clockevent
twd_set_next_event
name
rating
irq
list
“local timer”
350
29
event_handler
arm
private
timer
arm
global
timer
clocksource
read
clocksource_timer
timer_read
name
list
rating
“timer1”
flags
200
CLOCK_SOURCE_IS_CONTINUOUS
發生 hw timer interrupt
執行過期 timer 的 callback func.
low res. framework
根據 timer 設定的觸發時間
設定下一個 hw timer interrupt
highres. framework
128
End

Contenu connexe

Tendances

Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Ontico
 
Concurrent data structures in javaslang circuitbreaker
Concurrent data structures in javaslang circuitbreakerConcurrent data structures in javaslang circuitbreaker
Concurrent data structures in javaslang circuitbreakerBogdan Storozhuk
 
OSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPFOSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPFBrendan Gregg
 
bcc/BPF tools - Strategy, current tools, future challenges
bcc/BPF tools - Strategy, current tools, future challengesbcc/BPF tools - Strategy, current tools, future challenges
bcc/BPF tools - Strategy, current tools, future challengesIO Visor Project
 
Debugging linux kernel tools and techniques
Debugging linux kernel tools and  techniquesDebugging linux kernel tools and  techniques
Debugging linux kernel tools and techniquesSatpal Parmar
 
Kernel Recipes 2015 - Porting Linux to a new processor architecture
Kernel Recipes 2015 - Porting Linux to a new processor architectureKernel Recipes 2015 - Porting Linux to a new processor architecture
Kernel Recipes 2015 - Porting Linux to a new processor architectureAnne Nicolas
 
SFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMU
SFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMUSFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMU
SFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMULinaro
 
FreeBSD 2014 Flame Graphs
FreeBSD 2014 Flame GraphsFreeBSD 2014 Flame Graphs
FreeBSD 2014 Flame GraphsBrendan Gregg
 
Kernel Recipes 2015 - Kernel dump analysis
Kernel Recipes 2015 - Kernel dump analysisKernel Recipes 2015 - Kernel dump analysis
Kernel Recipes 2015 - Kernel dump analysisAnne Nicolas
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityBrendan Gregg
 
How to debug ocfs2 hang problem
How to debug ocfs2 hang problemHow to debug ocfs2 hang problem
How to debug ocfs2 hang problemGang He
 
re:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at Netflixre:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at NetflixBrendan Gregg
 
QCon 2015 Broken Performance Tools
QCon 2015 Broken Performance ToolsQCon 2015 Broken Performance Tools
QCon 2015 Broken Performance ToolsBrendan Gregg
 
YOW2020 Linux Systems Performance
YOW2020 Linux Systems PerformanceYOW2020 Linux Systems Performance
YOW2020 Linux Systems PerformanceBrendan Gregg
 
Troubleshooting Linux Kernel Modules And Device Drivers
Troubleshooting Linux Kernel Modules And Device DriversTroubleshooting Linux Kernel Modules And Device Drivers
Troubleshooting Linux Kernel Modules And Device DriversSatpal Parmar
 
Understanding Linux system hang
Understanding Linux system hangUnderstanding Linux system hang
Understanding Linux system hangGang He
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Brendan Gregg
 
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernelKernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernelAnne Nicolas
 
Performance Analysis Tools for Linux Kernel
Performance Analysis Tools for Linux KernelPerformance Analysis Tools for Linux Kernel
Performance Analysis Tools for Linux Kernellcplcp1
 

Tendances (20)

Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)
 
Concurrent data structures in javaslang circuitbreaker
Concurrent data structures in javaslang circuitbreakerConcurrent data structures in javaslang circuitbreaker
Concurrent data structures in javaslang circuitbreaker
 
OSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPFOSSNA 2017 Performance Analysis Superpowers with Linux BPF
OSSNA 2017 Performance Analysis Superpowers with Linux BPF
 
bcc/BPF tools - Strategy, current tools, future challenges
bcc/BPF tools - Strategy, current tools, future challengesbcc/BPF tools - Strategy, current tools, future challenges
bcc/BPF tools - Strategy, current tools, future challenges
 
Debugging linux kernel tools and techniques
Debugging linux kernel tools and  techniquesDebugging linux kernel tools and  techniques
Debugging linux kernel tools and techniques
 
BPF Tools 2017
BPF Tools 2017BPF Tools 2017
BPF Tools 2017
 
Kernel Recipes 2015 - Porting Linux to a new processor architecture
Kernel Recipes 2015 - Porting Linux to a new processor architectureKernel Recipes 2015 - Porting Linux to a new processor architecture
Kernel Recipes 2015 - Porting Linux to a new processor architecture
 
SFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMU
SFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMUSFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMU
SFO15-202: Towards Multi-Threaded Tiny Code Generator (TCG) in QEMU
 
FreeBSD 2014 Flame Graphs
FreeBSD 2014 Flame GraphsFreeBSD 2014 Flame Graphs
FreeBSD 2014 Flame Graphs
 
Kernel Recipes 2015 - Kernel dump analysis
Kernel Recipes 2015 - Kernel dump analysisKernel Recipes 2015 - Kernel dump analysis
Kernel Recipes 2015 - Kernel dump analysis
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF Observability
 
How to debug ocfs2 hang problem
How to debug ocfs2 hang problemHow to debug ocfs2 hang problem
How to debug ocfs2 hang problem
 
re:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at Netflixre:Invent 2019 BPF Performance Analysis at Netflix
re:Invent 2019 BPF Performance Analysis at Netflix
 
QCon 2015 Broken Performance Tools
QCon 2015 Broken Performance ToolsQCon 2015 Broken Performance Tools
QCon 2015 Broken Performance Tools
 
YOW2020 Linux Systems Performance
YOW2020 Linux Systems PerformanceYOW2020 Linux Systems Performance
YOW2020 Linux Systems Performance
 
Troubleshooting Linux Kernel Modules And Device Drivers
Troubleshooting Linux Kernel Modules And Device DriversTroubleshooting Linux Kernel Modules And Device Drivers
Troubleshooting Linux Kernel Modules And Device Drivers
 
Understanding Linux system hang
Understanding Linux system hangUnderstanding Linux system hang
Understanding Linux system hang
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)
 
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernelKernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
Kernel Recipes 2019 - Hunting and fixing bugs all over the Linux kernel
 
Performance Analysis Tools for Linux Kernel
Performance Analysis Tools for Linux KernelPerformance Analysis Tools for Linux Kernel
Performance Analysis Tools for Linux Kernel
 

Similaire à ch15-pv1-time-management

Process scheduling
Process schedulingProcess scheduling
Process schedulingHao-Ran Liu
 
Operating System-Ch5 cpu scheduling
Operating System-Ch5 cpu schedulingOperating System-Ch5 cpu scheduling
Operating System-Ch5 cpu schedulingSyaiful Ahdan
 
Java util concurrent
Java util concurrentJava util concurrent
Java util concurrentRoger Xia
 
Timers in Unix/Linux
Timers in Unix/LinuxTimers in Unix/Linux
Timers in Unix/Linuxgeeksrik
 
倒计时优化点滴
倒计时优化点滴倒计时优化点滴
倒计时优化点滴j5726
 
BKK16-104 sched-freq
BKK16-104 sched-freqBKK16-104 sched-freq
BKK16-104 sched-freqLinaro
 
See what happened with real time kvm when building real time cloud pezhang@re...
See what happened with real time kvm when building real time cloud pezhang@re...See what happened with real time kvm when building real time cloud pezhang@re...
See what happened with real time kvm when building real time cloud pezhang@re...LinuxCon ContainerCon CloudOpen China
 
DSP_Assign_2 (Autosaved)
DSP_Assign_2 (Autosaved)DSP_Assign_2 (Autosaved)
DSP_Assign_2 (Autosaved)Joseph Chandler
 
Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)Sneeker Yeh
 
XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.
XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.
XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.The Linux Foundation
 

Similaire à ch15-pv1-time-management (20)

timers 2.ppt
timers 2.ppttimers 2.ppt
timers 2.ppt
 
Process scheduling
Process schedulingProcess scheduling
Process scheduling
 
Operating System-Ch5 cpu scheduling
Operating System-Ch5 cpu schedulingOperating System-Ch5 cpu scheduling
Operating System-Ch5 cpu scheduling
 
Ch5 cpu scheduling
Ch5 cpu schedulingCh5 cpu scheduling
Ch5 cpu scheduling
 
Java util concurrent
Java util concurrentJava util concurrent
Java util concurrent
 
Timers in Unix/Linux
Timers in Unix/LinuxTimers in Unix/Linux
Timers in Unix/Linux
 
倒计时优化点滴
倒计时优化点滴倒计时优化点滴
倒计时优化点滴
 
Timers
TimersTimers
Timers
 
Timer
TimerTimer
Timer
 
Prosess accouting
Prosess accoutingProsess accouting
Prosess accouting
 
5.CPU Scheduling
5.CPU Scheduling5.CPU Scheduling
5.CPU Scheduling
 
BKK16-104 sched-freq
BKK16-104 sched-freqBKK16-104 sched-freq
BKK16-104 sched-freq
 
See what happened with real time kvm when building real time cloud pezhang@re...
See what happened with real time kvm when building real time cloud pezhang@re...See what happened with real time kvm when building real time cloud pezhang@re...
See what happened with real time kvm when building real time cloud pezhang@re...
 
Linux class 9 15 oct 2021-5
Linux class 9   15 oct 2021-5Linux class 9   15 oct 2021-5
Linux class 9 15 oct 2021-5
 
DSP_Assign_2 (Autosaved)
DSP_Assign_2 (Autosaved)DSP_Assign_2 (Autosaved)
DSP_Assign_2 (Autosaved)
 
Burst clock controller
Burst clock controllerBurst clock controller
Burst clock controller
 
속도체크
속도체크속도체크
속도체크
 
Iuwne10 S06 L01
Iuwne10 S06 L01Iuwne10 S06 L01
Iuwne10 S06 L01
 
Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)Dead Lock Analysis of spin_lock() in Linux Kernel (english)
Dead Lock Analysis of spin_lock() in Linux Kernel (english)
 
XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.
XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.
XPDDS18: Real Time in XEN on ARM - Andrii Anisov, EPAM Systems Inc.
 

Plus de yushiang fu

ch13-pv1-system-calls
ch13-pv1-system-callsch13-pv1-system-calls
ch13-pv1-system-callsyushiang fu
 
ch9-pv1-the-extended-filesystem-family
ch9-pv1-the-extended-filesystem-familych9-pv1-the-extended-filesystem-family
ch9-pv1-the-extended-filesystem-familyyushiang fu
 
ch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystemch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystemyushiang fu
 
ch6-pv2-device-drivers
ch6-pv2-device-driversch6-pv2-device-drivers
ch6-pv2-device-driversyushiang fu
 
ch3-pv1-memory-management
ch3-pv1-memory-managementch3-pv1-memory-management
ch3-pv1-memory-managementyushiang fu
 
ch4-pv2-virtual-process-memory
ch4-pv2-virtual-process-memorych4-pv2-virtual-process-memory
ch4-pv2-virtual-process-memoryyushiang fu
 

Plus de yushiang fu (7)

ch13-pv1-system-calls
ch13-pv1-system-callsch13-pv1-system-calls
ch13-pv1-system-calls
 
ch9-pv1-the-extended-filesystem-family
ch9-pv1-the-extended-filesystem-familych9-pv1-the-extended-filesystem-family
ch9-pv1-the-extended-filesystem-family
 
ch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystemch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystem
 
ch7-pv1-modules
ch7-pv1-modulesch7-pv1-modules
ch7-pv1-modules
 
ch6-pv2-device-drivers
ch6-pv2-device-driversch6-pv2-device-drivers
ch6-pv2-device-drivers
 
ch3-pv1-memory-management
ch3-pv1-memory-managementch3-pv1-memory-management
ch3-pv1-memory-management
 
ch4-pv2-virtual-process-memory
ch4-pv2-virtual-process-memorych4-pv2-virtual-process-memory
ch4-pv2-virtual-process-memory
 

ch15-pv1-time-management