kernel2.6 时钟中断问题
研究时钟和中断有一段时间了,想和大家讨论下,希望高手能帮助我揭开迷惑。。
我们都知道从保留中断以后的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。。大虾给我些提示都行,谢谢了。。。。
...全文
相关推荐
Linux 内核2.6.26.4配置菜单中文手册.pdf
### Linux 内核2.6.26.4配置菜单中文手册知识点解析#### 总览本手册针对Linux内核2.6.26.4版本,详细介绍了内核配置菜单的各项功能与参数,旨在帮助Linux用户和开发者更深入地理解并定制内核配置
linux经典图书之kernel篇
**定时与同步**:详细阐述了Linux内核中时间管理的基本概念,如定时器、时钟中断等,同时介绍了各种同步机制,如自旋锁、信号量等,以及它们在多处理器环境下的应用。6.
Linux 2.6内核标准教程(部分)
第6章聚焦于内核时间度量,讲述了时钟中断处理的原理以及软定时器的工作方式。时间管理是确保系统稳定性和任务调度准确性的重要因素。本章内容对那些希望深入理解Linux内核时间管理机制的读者将大有裨益。
linux_kernel启动过程
2. 内核初始化 - 静态初始化:内核映像加载到内存后,首先执行的是`start_kernel()`函数,它负责进行一些基本的初始化,如设置堆栈、初始化内存管理、时钟中断等。
LINUX的调度和时钟中断处理代码的分析
根据操作系统课程设计指导书所提供的基础知识,分析文件kernel/sched.c 和include/asm-i386/spinlock.h 中关于Linux的调度和时钟中断的代码,了解一个LINUX操


