为什么时钟中断从不在进程中间工作?
Why the clock interrupt never works in the middle of process?
当从内核(RING0)跳转到进程(RING1)时,无论我等多久,时钟中断都不会发生。
但是在内核中间,我使用 sti
和 hlt
来测试时钟中断然后它确实发生了。 我想知道为什么时钟中断在进程中间不工作的原因。
提前致谢。
这是我的流程代码。
#include "type.h"
#include "const.h"
#include "intVector.h"
#include "important.h"
#include "process.h"
#include "prototype.h"
#include "task.h"
#include "global.h"
void delay(){
for (int i = 0; i < 1; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 1000; k++) {}
}
}
}
PUBLIC void TestA() { //0x05:0x30d01
int i = 0;
while (1) {
dispPos = 0;
dispStr("A");
dispInt(i++);
dispStr(".");
delay();
}
}
我不知道您是如何得出结论,当您 运行 处于用户模式的进程时不会发生时钟中断,但事实并非如此。如果是这种情况,在没有硬件定时器的系统上允许它们 tickless,应该没有办法重新获得对内核的控制,以防进程没有'yield cpu 本身。事实是它对用户透明地发生,并且可以在上下文切换中结束,如果有一个更优先的进程并且是时候重新计算优先级了。
当然,当你处于用户模式时你不能禁止中断,所以在我看来,你知道中断发生的唯一方法需要安装某种用户模式可访问的时钟中断计数器,并且定期检查,或使用数字信号分析仪检查总线中的硬件中断确认。
时钟中断通常是执行时间最短且优先级最高的中断,所以认为有什么东西在阻碍它实际上是非常奇怪的(通常,这意味着只有 nmi 会中断时钟滴答,但这通常意味着一些严重的硬件故障 ---nmi 历史上与核心内存中的奇偶校验故障或即将断电有关)
当从内核(RING0)跳转到进程(RING1)时,无论我等多久,时钟中断都不会发生。
但是在内核中间,我使用 sti
和 hlt
来测试时钟中断然后它确实发生了。 我想知道为什么时钟中断在进程中间不工作的原因。
提前致谢。
这是我的流程代码。
#include "type.h"
#include "const.h"
#include "intVector.h"
#include "important.h"
#include "process.h"
#include "prototype.h"
#include "task.h"
#include "global.h"
void delay(){
for (int i = 0; i < 1; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 1000; k++) {}
}
}
}
PUBLIC void TestA() { //0x05:0x30d01
int i = 0;
while (1) {
dispPos = 0;
dispStr("A");
dispInt(i++);
dispStr(".");
delay();
}
}
我不知道您是如何得出结论,当您 运行 处于用户模式的进程时不会发生时钟中断,但事实并非如此。如果是这种情况,在没有硬件定时器的系统上允许它们 tickless,应该没有办法重新获得对内核的控制,以防进程没有'yield cpu 本身。事实是它对用户透明地发生,并且可以在上下文切换中结束,如果有一个更优先的进程并且是时候重新计算优先级了。
当然,当你处于用户模式时你不能禁止中断,所以在我看来,你知道中断发生的唯一方法需要安装某种用户模式可访问的时钟中断计数器,并且定期检查,或使用数字信号分析仪检查总线中的硬件中断确认。
时钟中断通常是执行时间最短且优先级最高的中断,所以认为有什么东西在阻碍它实际上是非常奇怪的(通常,这意味着只有 nmi 会中断时钟滴答,但这通常意味着一些严重的硬件故障 ---nmi 历史上与核心内存中的奇偶校验故障或即将断电有关)