2014-02-24 33 views
-2

是否有汇编指令让我们直接读取处理器标志寄存器中的中断标志?如何在x86处理器中读取中断标志

是否有可能读取C/C++中的中断标志?

+0

这并不重要,我需要在64位处理器 –

+0

指令为什么?你在编写一个内核模块吗? –

+0

中为 – EJP

回答

1

根据Wikipedia,根据您使用的架构,使用PUSHF,PUSHFD或PUSHFQ指令。

除非你正在编写内核模块,否则我看不到这一点。用户模式下永远不会清楚。

0

我假设你正在编写自己的操作系统或某种嵌入式程序。不应读取处理器中断标志,而应该让中断例程在内存中设置或增加某个位置,或者将消息推回某种类型的消息队列,以便中断例程可以触发线程或允许某个主级例程检查如果中断例程已经处理了一个中断。

1

您需要一些内联汇编。例如,Linux在'irqflags.h'中执行此操作。该功能适用​​于32位和64位IA。

static inline unsigned long native_save_fl(void) 
{ 
    unsigned long flags; 

    /* 
     * "=rm" is safe here, because "pop" adjusts the stack before 
     * it evaluates its effective address -- this is part of the 
     * documented behavior of the "pop" instruction. 
     */ 
    asm volatile("# __raw_save_flags\n\t" 
       "pushf ; pop %0" 
       : "=rm" (flags) 
       : /* no input */ 
       : "memory"); 

    return flags; 
} 

这将返回所有的处理器EFLAGS位,包括中断对位9使能(EFLAGS.IF)如果你想只是如果是检查,通过在0x200掩盖返回值。