操作系统学习笔记(20)--开中断、关中断及原子操作

 

 

操作系统在很多情况下,需要进行原子操作,此时是不可以进行中断响应的。

根据需要此时需要关闭中断,在原子操作完了之后再进行开中断。

 

中断相关的操作有:

1 知道EFFLAG的中断位

2 中断开、关的指令

3 如果进行C语言设置时的参数传递

 

下面给出部分伪码:

 

 原子操作() {

  开始原子操作();

  操作;

  结束原子操作();

}

 

开始原子操作() {

 1 检查中断是否允许

    {

         获取EFLAGS寄存器值查看中断位值判断是否允许 为1是开中断 0为关中断;

    }

 2 允许的话关闭中断 

    {

        cli;

    }

}

 

汇编代码如下: GLOBAL Get_Current_EFLAGS供C语言调用,这里使用eax进行参数传递。我不是很清楚可能有规定,为什么不是ebx呢?不知道标准在什么地方还是约定。不过它的意思肯定是这个传出来的。

可参考http://blog.csdn.net/longronglin/archive/2008/03/29/2228999.aspx

; Return current contents of eflags register. align 16 Get_Current_EFLAGS: pushfd ; push eflags pop eax ; pop contents into eax ret

 

开关中断的命令sti cli

/* * Unblock interrupts. */ static __inline__ void __Enable_Interrupts(void) { __asm__ __volatile__ ("sti"); }

static __inline__ void __Disable_Interrupts(void) { __asm__ __volatile__ ("cli"); }

 

 

结束原子操作(

// 确保当前中断时关的。

// 需要有调用前中断的开关状态,如果是开的需要重新打开

)

 

这个基本就是操作系统的处理过程。

 

你可能感兴趣的:(C/C++,Linux/Unix/AIX,操作系统)