【发布时间】:2012-04-21 01:21:05
【问题描述】:
我正在编写一个将从汇编代码中调用的 C 函数。
(具体来说,我想在linux内核的系统调用处理路径中做一些检查工作,所以我会在entry_32.S中调度系统调用之前调用c函数)
在定义我的 c 函数时,我对“asmlinkage”修饰符感到困惑。
我知道asmlinkage是告诉编译器参数会通过栈传递。
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
问题:
(1) 定义这样一个从汇编代码调用的函数时是否需要asmlinkage?
(2) gcc 中的默认调用约定是什么。如果我在定义一个c函数时省略了“asmlinkage”,它是暗示_cdecl还是fastcall?
(3) 如果默认调用约定是 cdecl,为什么需要 asmlinkage,考虑到 cdecl 等于 asmlinkage 修饰符? (我说的对吗?)
(4) 为什么那些系统调用函数都是用asmlinkage声明的。我们可以先将参数复制到寄存器中,然后调用那些系统调用函数吗?在我看来,在 x86 中,当发出系统调用时,参数很容易保存在寄存器中;那么为什么还要费心将 then 保存在堆栈中以通过堆栈约定强制执行此类传递参数呢?
最后,谁能推荐一些我可以参考的资源/书籍来进行这种混合汇编/c 编程?
【问题讨论】:
标签: c assembly linux-kernel system-calls calling-convention