时钟中断的重入问题

konglinglong 2008-10-04 11:07:27
hwint00: ; 时钟中断处理程序

sub esp, 4
pushad ; ┓
push ds ; ┃
push es ; ┣ 保存原寄存器值
push fs ; ┃
push gs ; ┛
mov dx, ss
mov ds, dx
mov es, dx

mov esp, StackTop ; 切到内核栈

;sti ;置位中断标志位,使cpu可以响应新的中断

push clock_int_msg1 ;这里打印字符 ^
call disp_str
add esp, 4

push 10 ;设置延迟,以便让中断重入
call delay
add esp, 4

push clock_int_msg2 ;这里打印字符 ~
call disp_str
add esp, 4

;cli ;清除中断标志位

mov al, EOI ; ┓发送EOI
out INT_M_CTL, al ; ┛

mov esp, [p_proc_ready] ; 离开内核栈;

lea eax, [esp + P_STACKTOP]
mov dword [tss + TSS3_S_SP0], eax

pop gs ; ┓
pop fs ; ┃
pop es ; ┣ 恢复原寄存器值
pop ds ; ┃
popad ; ┛
add esp, 4

iretd


内核运行后打印
B0x0^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~

现在在内核中只实现了一个进程,那个B0x0就是那个进程产生的,那进程如下
void Test()
{
int i=0;
while (1)
{
disp_str("B");
disp_int(i++);
}
}

由于产生中断时会把中断标志位IF清0,所以我觉得如果把sti和cli注释掉后中断就不会再发生,因些不可能会出现中断重入的情况,但在调试时却出现了,真不知是哪个地方出现了问题。。。
...全文
511 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
朽木可雕 2012-06-06
  • 打赏
  • 举报
回复
我感觉应该是当一个时钟中断发生的时候,此时钟中断用了太多的时候见以至于下一个中断信号都来了,但是因为设置了时钟中断不能重入所以等第一个中断结束后跳到进程TEST,此时第二时钟中断被响应,程序有执行时钟中断,如此循环。
zhizhi_2008 2008-10-24
  • 打赏
  • 举报
回复
按你的程序里的进程的代码,进程里没加 delay,是不会打印出像你据说的效果的。而是在第一次中断之前,飞快的打印出几十个B0x0 B0x01 B0x02...直到~^~^~^~
firePhoenix1981 2008-10-22
  • 打赏
  • 举报
回复
是不是这样:
push 10 ;设置延迟,以便让中断重入
call delay
add esp, 4

你关掉中断后(注释掉了sti),delay的时候一直就是在中断处理函数里面(你的delay肯定是循环实现的吧),delay后直接运行了你的单独的进程,这时候下一个时钟中断就到了,也就是说你的进程实际上没有多少实际的执行时间

你是不是在写OS?并且还没有加入调度函数吧,呵呵
campuspuzzle 2008-10-20
  • 打赏
  • 举报
回复
不太明白你说的意思,这个显示结果跟重入有啥关系?当进入中断时会保存eflag,退出时会恢复eflag,你在中断程序里开关中断有啥用?只要进入中断前是开中断的,退出后中断又打开了。时钟中断程序就能不停运行。
土豆 2008-10-14
  • 打赏
  • 举报
回复
不经意之间翻出了这个帖子,哥们,问题还解决了。貌似大家没能提供有用的信息。

直接写显存是没有问题的
konglinglong 2008-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 FireAngel 的回复:]
哥们,你那函数中disp_str和disp_int如何实现的?可能用到了软中断吧?那不几产生了中断嵌套的问题?一般中断中打印都要特别处理的,不会调用系统的例程,而是直接操作底层硬件。不知道你的打印怎么实现的。
[/Quote]

disp_str和disp_int没有使用软中断,而是用了直接写入显存的办法
mov [gs:edi], ax

delay则是使用c语言的三个套嵌的for循环来实现
xlanchen 2008-10-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 FireAngel 的回复:]
哥们,你那函数中disp_str和disp_int如何实现的?可能用到了软中断吧?那不几产生了中断嵌套的问题?一般中断中打印都要特别处理的,不会调用系统的例程,而是直接操作底层硬件。不知道你的打印怎么实现的。
[/Quote]

支持4楼的回答
土豆 2008-10-06
  • 打赏
  • 举报
回复
哥们,你那函数中disp_str和disp_int如何实现的?可能用到了软中断吧?那不几产生了中断嵌套的问题?一般中断中打印都要特别处理的,不会调用系统的例程,而是直接操作底层硬件。不知道你的打印怎么实现的。
xlanchen 2008-10-05
  • 打赏
  • 举报
回复
设置的是中断门?
xlanchen 2008-10-05
  • 打赏
  • 举报
回复
你调试的时候看了eflags的值了么?
konglinglong 2008-10-05
  • 打赏
  • 举报
回复
中断门已经设置好,这个是时钟处理程序

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧