关于irq相关的内联汇编代码,不懂其意思,请高人讲解

cumirror 2012-07-18 05:38:00
代码如下:

#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相关函数中调用形式如下:

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操作时关闭中断吗?相关的汇编代码具体如何解释呢?
...全文
153 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cumirror 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
第一个宏是保存标志寄存器的值,第二个宏是恢复标志寄存器的值。第一个宏中的pushfl指令是把标志寄存器的值压栈。而popl是把栈顶的值(刚压入栈的flags)弹出到eflags变量中。这样,你可以很容易地读懂第二个宏

cli指令关闭CPU对外部中断的响应,在操作完成之后再使用sti指令开启对外部中断的响应
[/Quote]
这几天自己也在看相关资料,结合你的解释,差不多能理解,谢谢。
帅得不敢出门 2012-07-20
  • 打赏
  • 举报
回复
第一个宏是保存标志寄存器的值,第二个宏是恢复标志寄存器的值。第一个宏中的pushfl指令是把标志寄存器的值压栈。而popl是把栈顶的值(刚压入栈的flags)弹出到eflags变量中。这样,你可以很容易地读懂第二个宏

cli指令关闭CPU对外部中断的响应,在操作完成之后再使用sti指令开启对外部中断的响应
cumirror 2012-07-19
  • 打赏
  • 举报
回复
有人在吗?我先顶下,别沉了。

4,436

社区成员

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

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