免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2366 | 回复: 4
打印 上一主题 下一主题

请教大师们关于BUILD_COMMON_IRQ的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-10 15:26 |只看该作者 |倒序浏览
Linux 2.4中在Hw_irq.h中152行声明了一个宏:
#define BUILD_COMMON_IRQ() \
asmlinkage void call_do_IRQ(void); \
__asm__( \
. "\n" __ALIGN_STR"\n" \
. "common_interrupt:\n\t" \
. SAVE_ALL \
. "pushl $ret_from_intr\n\t" \
. SYMBOL_NAME_STR(call_do_IRQ)":\n\t" \
. "jmp "SYMBOL_NAME_STR(do_IRQ));


然后在I8259.c中直接引用了该宏,并且该引用并不位于任何函数体内部,
#include <linux/irq.h>
......

BUILD_COMMON_IRQ()

......
spinlock_t i8259A_lock = SPIN_LOCK_UNLOCKED;
......

那么展开后,其实就相当于在.c文件中直接写了这么不属于任何函数的一段代码:
asmlinkage void call_do_IRQ(void); //注意这里还有个;号,不知道是不是表示函数申明?
__asm__(
. "\n" __ALIGN_STR"\n"
. "common_interrupt:\n\t"
. SAVE_ALL
. "pushl $ret_from_intr\n\t"
. SYMBOL_NAME_STR(call_do_IRQ)":\n\t"
. "jmp "SYMBOL_NAME_STR(do_IRQ));

请问这样一段代码直接放在一个.c文件里,gcc如何去解释它,当作函数看么?还是什么其它意思?真是让人糊涂!哪位大师给指点一下这样嵌入汇编代码究竟是什么意思?(另外,关于此段汇编代码的具体含义就无需解释了)

论坛徽章:
0
2 [报告]
发表于 2007-05-10 15:30 |只看该作者
>>asmlinkage void call_do_IRQ(void); //注意这里还有个;号,不知道是不是表示函数申明?

1.函数申明

__asm__(
. "\n" __ALIGN_STR"\n"
. "common_interrupt:\n\t"
. SAVE_ALL
. "pushl $ret_from_intr\n\t"
. SYMBOL_NAME_STR(call_do_IRQ)":\n\t" //<<<2.函数定义
"jmp "SYMBOL_NAME_STR(do_IRQ));

论坛徽章:
0
3 [报告]
发表于 2007-05-10 16:01 |只看该作者
qtdszws,您好,这里的汇编语言直接嵌入在C文件中而不属于任何函数体,这样使允许的么?

论坛徽章:
0
4 [报告]
发表于 2007-05-10 16:12 |只看该作者
可以啊,gcc会把这样的汇编代码直接插入到最终的编译输出文件中,这个文件是汇编文件,然后由as编译成目标文件

论坛徽章:
0
5 [报告]
发表于 2007-05-10 16:17 |只看该作者

回复 #4 qtdszws 的帖子

那么,大师,就上面的
#include <linux/irq.h>
......
BUILD_COMMON_IRQ()

......
spinlock_t i8259A_lock = SPIN_LOCK_UNLOCKED;

调用而言,这里用C表达的话,应该是个什么样子?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP