我正在编写一个将从汇编代码调用的C函数.
(具体来说,我想在linux内核的系统调用处理路径中做一些检查工作,所以我将在entry_32.S中调度系统调用之前调用c函数)
在定义我的c函数时,我对"asmlinkage"修饰符感到困惑.
我知道asmlinkage是告诉编译器参数将通过堆栈传递.
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
问题:
(1)在定义将从汇编代码调用的函数时是否需要asmlinkage?
(2)gcc中的默认调用约定是什么.如果我在定义交流功能时省略"asmlinkage",它是否意味着_cdecl或fastcall?
(3)如果默认调用约定是cdecl,为什么需要asmlinkage,考虑到cdecl等于asmlinkage修饰符?(我在这里纠正吗?)
(4)为什么那些系统调用函数都是用asmlinkage声明的.我们可以先将参数复制到寄存器中,然后调用那些系统调用函数吗?从我的角度来看,在x86中,当发出系统调用时,参数很容易保存在寄存器中; 那么为什么还要在堆栈中保存然后通过堆栈约定强制执行这样的传递参数呢?
最后,任何人都可以推荐一些我可以参考混合汇编/ c编程的资源/书籍吗?