kernel2.6 时钟中断问题

yearn520 2010-09-25 01:04:45
研究时钟和中断有一段时间了,想和大家讨论下,希望高手能帮助我揭开迷惑。。

我们都知道从保留中断以后的0号是时钟中断,它给两个计时器提供中断tick,一个是pic的pit另外一个是cpu内部的hpet。
当然读写rtc也许要pit的支持。

暂且不管tsc
在smp出来之前,pit和hpet基本上掌管各种内核和用户的定时操作。并且irq0通过pic只发送到cpu0
当smp出来以后,irq0需要发送到各个处理器,所以通过apic方式进行分发,可以设置,默认irqbalance来 调节。既然要分发,local apic就要来接收处理中断。
另一个方面,新加进来了一个local timer interrupt.这个是基于总线的时钟中断,不太理解这个意思,它也算是也时钟源,它是apic的,为啥叫基于总线的?这个和之前的时钟中断有啥关系么?

更奇怪的我最近用cat /proc/interrupts 这个命令发现,0号时钟中断都是200左右,很小的数字,显然现在这个已经不再是时钟源了,因为pit已经改变了工作方式,工作方式如下:
1. Mode 0:当通道处于“Terminal count”状态时产生中断信号。
2. Mode 1:Hardware retriggerable one-shot。
3. Mode 2:Rate Generator。
4. Mode 3:方波信号发生器。
5. Mode 4:Software triggered strobe。
6. Mode 5:Hardware triggered strobe。

tsc的源我还不是很清楚,只知道是cpu持续产生。
但是8254还有一小部分工作在做,因为它不是完全的0。而系统调度需要的各种定时以及用户定时已经由local timer interrupt 接管了,我用setitimer的read_time测试过,这个函数的系统调用函数我也看过了。0号中断仍然没有放映。说明是local timer 在起作用。测试内核2.6.33,0号中断类似,中断如下:
CPU0 CPU1
0: 299 (很小) 0 IO-APIC-edge timer
1: 3957 130 IO-APIC-edge i8042
7: 790772 0 IO-APIC-edge parport0
8: 0 0 IO-APIC-edge rtc0
9: 0 0 IO-APIC-fasteoi acpi
12: 407933 21011 IO-APIC-edge i8042
14: 184 0 IO-APIC-edge libata
15: 246417 0 IO-APIC-edge libata
16: 207215 14913 IO-APIC-fasteoi libata, uhci_hcd:usb4
17: 1158775 0 IO-APIC-fasteoi uhci_hcd:usb2, uhci_hcd:usb5, i915@pci:0000:00:02.0
18: 912392 0 IO-APIC-fasteoi Intel ICH5
19: 8324586 1270 IO-APIC-fasteoi uhci_hcd:usb3, eth0
20: 1600 0 IO-APIC-fasteoi ehci_hcd:usb1
NMI: 0 0
LOC: 8980952 8845140(真正时钟源)
ERR: 0
MIS: 0

然而有些系统是如下:0号中断 仍然在用。
[root@seli-vaio ikarus]# cat /proc/interrupts
CPU0 CPU1
0: 30027 (正常时钟源) 0 IO-APIC-edge timer
1: 132 0 IO-APIC-edge i8042
9: 1282 0 IO-APIC-fasteoi acpi
12: 120 0 IO-APIC-edge i8042
14: 1377 0 IO-APIC-edge libata
15: 0 0 IO-APIC-edge libata
16: 0 225322 IO-APIC-fasteoi uhci_hcd:usb4, eth0, ohci1394, yenta, nvidia
17: 2507 0 IO-APIC-fasteoi uhci_hcd:usb2, tifm_7xx1
18: 6082 0 IO-APIC-fasteoi uhci_hcd:usb3, ipw3945
20: 6020 0 IO-APIC-fasteoi libata
21: 3 0 IO-APIC-fasteoi uhci_hcd:usb1, ehci_hcd:usb5
22: 2650 0 IO-APIC-fasteoi HDA Intel
NMI: 0 0
LOC: 23363 22114 (也是时钟源)
ERR: 0
MIS: 0

我不清楚什么情况下禁止0号为一般时钟中断的?是否有个开关?内核出处也行。我现在必须要用pic时钟(8254)作为系统时钟源,该怎么办,而且不能去掉smp。。大虾给我些提示都行,谢谢了。。。。
...全文
150 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yearn520 2011-07-04
现在基本弄清楚了,我在csdn博客里面总结了下最新内核的中断和时钟方面的知识,如果谁还有疑问的可以去我博客逛逛,看能不能有些启发。
http://blog.csdn.net/yearn520/article/details/6442084
回复
dfysy 2010-10-06
x86的不懂,在俺们ARM体系里面,时钟中断可以是任何的IRQ Number。帮顶!
回复
小魔菇 2010-10-02
lz好好研究哈 弄清楚告诉我们一下
回复
yearn520 2010-10-02
人呢,2.6.33的系统怎么选择时钟的?
回复
yearn520 2010-10-02
开了apic,就会使用local timer作为时钟源,但是这个选择方式改变了,内核里面说现在profiling and update will be switched off when the local apic is registered..it replace of the "#ifdef local_apic
!using _apic_timer...."
回复
wjh19870407 2010-09-27
支持楼主
回复
steptodream 2010-09-26
不会 帮不上忙 那就帮顶
回复
yearn520 2010-09-26
顶呀顶呀,快来人呀
回复
yearn520 2010-09-25
高手帮帮忙呀。。。大家帮俺顶顶哇。谢谢了,急。。。
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4154

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2010-09-25 01:04
社区公告
暂无公告