当前位置: 技术问答>linux和unix
kernel2.6 时钟中断问题
来源: 互联网 发布时间:2016-12-10
本文导语: 研究时钟和中断有一段时间了,想和大家讨论下,希望高手能帮助我揭开迷惑。。 我们都知道从保留中断以后的0号是时钟中断,它给两个计时器提供中断tick,一个是pic的pit另外一个是cpu内部的hpet。 当然读写rtc也许...
研究时钟和中断有一段时间了,想和大家讨论下,希望高手能帮助我揭开迷惑。。
我们都知道从保留中断以后的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。。大虾给我些提示都行,谢谢了。。。。
我们都知道从保留中断以后的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。。大虾给我些提示都行,谢谢了。。。。
|
不会 帮不上忙 那就帮顶
|
支持楼主
|
lz好好研究哈 弄清楚告诉我们一下
|
x86的不懂,在俺们ARM体系里面,时钟中断可以是任何的IRQ Number。帮顶!
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。