当前位置:  技术问答>linux和unix

时钟中断的重入问题

    来源: 互联网  发布时间:2016-05-13

    本文导语:  hwint00:        ; 时钟中断处理程序          sub    esp, 4     pushad        ; ┓     push    ds    ; ┃     push    es    ; ┣ 保存原寄存器值     push    fs    ; ┃     push    gs  ...

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注释掉后中断就不会再发生,因些不可能会出现中断重入的情况,但在调试时却出现了,真不知是哪个地方出现了问题。。。

|
是不是这样:
    push    10            ;设置延迟,以便让中断重入
    call    delay
    add        esp, 4
    
你关掉中断后(注释掉了sti),delay的时候一直就是在中断处理函数里面(你的delay肯定是循环实现的吧),delay后直接运行了你的单独的进程,这时候下一个时钟中断就到了,也就是说你的进程实际上没有多少实际的执行时间

你是不是在写OS?并且还没有加入调度函数吧,呵呵

|
按你的程序里的进程的代码,进程里没加 delay,是不会打印出像你据说的效果的。而是在第一次中断之前,飞快的打印出几十个B0x0 B0x01 B0x02...直到~^~^~^~

|
哥们,你那函数中disp_str和disp_int如何实现的?可能用到了软中断吧?那不几产生了中断嵌套的问题?一般中断中打印都要特别处理的,不会调用系统的例程,而是直接操作底层硬件。不知道你的打印怎么实现的。

|


支持4楼的回答

|
不经意之间翻出了这个帖子,哥们,问题还解决了。貌似大家没能提供有用的信息。

直接写显存是没有问题的

|
不太明白你说的意思,这个显示结果跟重入有啥关系?当进入中断时会保存eflag,退出时会恢复eflag,你在中断程序里开关中断有啥用?只要进入中断前是开中断的,退出后中断又打开了。时钟中断程序就能不停运行。

    
 
 

您可能感兴趣的文章:

  • 关于linux时钟中断的问题.
  • 如何截取linux时钟中断?
  • 如何计算中断处理函数消耗的CPU时钟?
  • 关于时钟中断
  • 时钟中断对应8259A-1的IRQ0是硬件确定的,还是可以编程修改?
  • 关于时钟中断的问题?
  • 兄弟们,请帮帮忙吧,关于LINUX 的调度和时钟中断处理代码的分析!在线等待啊。。。:(
  • 关于时钟中断和任务抢占的问题,请教各位大侠,不胜感激!
  • RTC通过IRQ0产生的时钟中断的作用?
  • kernel2.6 时钟中断问题
  • Linux 线程 时钟中断
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • 关于时钟的误差问题?
  • PLL时钟分频的问题
  • SPI 时钟问题
  • 关于分时操作系统的时钟问题
  • linux下时钟问题
  • 一个关于时钟边界情况的奇怪问题,大家帮我看看
  • linux系统时钟问题
  • 如何让REDHAT ENTE4 U4 下有效的自动调整时钟?即时间同步问题...
  • linux下时钟精度问题
  • jquery局部刷新DIV及动态时钟显示iterator无法输出数据的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 用sysconf(_SC_CLK_TCK)可以获得时钟的hz,还有什么方法可以获得内核时钟的hz
  • linux时钟为何与BIOS时钟不同步?如何使其同步?
  • 实时时钟RTC和系统定时器的联系?
  • 时钟模拟软件 TZClock
  • Linux的时钟精度达到多高?
  • 如何得到linux机器的时钟频率?
  • jQuery 时钟插件 jDigiClock
  • FreeBSD系统下如何设置一个时钟屏保(图形界面下)
  • linux 内核时钟频率
  • AT91RM9200串口1如何设置波特率模式为SCLK时钟同步
  • 关于linux系统的时钟滴答疑问
  • 用户CPU时间 系统CPU时间 时钟时间 不懂
  • 单片机实时时钟
  • 数字时钟软件 LCARS 24
  • 番茄时钟 pomodoro
  • 如何读取系统时钟?
  • 怎么把系统的时钟调快一倍?
  • 线程如何给自己注册时钟信号?
  • 如何读取i2c 上 ds1337时钟芯片 ~~~~~~~
  • 用哪些函数可以得到执行一个程序的系统CPU时间,用户CPU时间,时钟时间啊?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3