关于irq相干的内联汇编代码,不懂其意思,请高人讲解
关于irq相关的内联汇编代码,不懂其意思,请高人讲解
代码如下:
在进行console相关函数中调用形式如下:
它的作用进行console操作时关闭中断吗?相关的汇编代码具体如何解释呢?
------解决方案--------------------
第一个宏是保存标志寄存器的值,第二个宏是恢复标志寄存器的值。第一个宏中的pushfl指令是把标志寄存器的值压栈。而popl是把栈顶的值(刚压入栈的flags)弹出到eflags变量中。这样,你可以很容易地读懂第二个宏
cli指令关闭CPU对外部中断的响应,在操作完成之后再使用sti指令开启对外部中断的响应
代码如下:
- C/C++ code
#define SAVE_AND_DIS_IRQ(eflags)\ __asm__ volatile ("pushfl\n\t"\ "popl %%eax\n\t"\ "movl %%eax,%0\n\t"\ :"=g"(eflags)\ );\ __asm__ volatile ("cli") #define SAVE_AND_EN_IRQ(eflags)\ __asm__ volatile ("pushfl\n\t"\ "popl %%eax\n\t"\ "movl %%eax,%0\n\t"\ :"=g"(eflags)\ );\ __asm__ volatile ("sti") #define RESTORE_IRQ(eflags)\ __asm__ volatile ("movl %0,%%eax\n\t"\ "pushl %%eax\n\t"\ "popfl\n\t"\ :"=m"(eflags)\ )
在进行console相关函数中调用形式如下:
- C/C++ code
void console_input(unsigned char c) { unsigned long eflags; SAVE_AND_DIS_IRQ(eflags); console.out(c); if (c == KEY_ENTER) { /*enter.*/ if (!console_cmd_go()) { console_cmd_clear(); printk('s', CONSOLE_LOGO); } else { console_cmd_clear(); //console_input(KEY_ENTER); } } else if (c == 8) {/*backspace*/ console_cmd_delchar(); } else { console_cmd_addchar(c); } RESTORE_IRQ(eflags); return; }
它的作用进行console操作时关闭中断吗?相关的汇编代码具体如何解释呢?
------解决方案--------------------
第一个宏是保存标志寄存器的值,第二个宏是恢复标志寄存器的值。第一个宏中的pushfl指令是把标志寄存器的值压栈。而popl是把栈顶的值(刚压入栈的flags)弹出到eflags变量中。这样,你可以很容易地读懂第二个宏
cli指令关闭CPU对外部中断的响应,在操作完成之后再使用sti指令开启对外部中断的响应