我正在写一个将从汇编代码中调用的C函数。从程序集中调用c函数需要“asmlinkage”吗?
(具体来说,我想要做的系统调用Linux内核处理的路径一些检查工作,所以我会调用C功能的系统调用在entry_32.S派遣之前)
我很困惑在定义我的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中,发出系统调用时,参数很容易保存在寄存器中;那么为什么还要在堆栈中保存以通过堆栈约定来强制执行这样的传递参数呢?
最后,有人可以推荐一些我可以参考的混合装配/ c编程资源/书籍吗?
在32位x86上,内核中使用的调用约定似乎不完全是GNU fastcall(即前'2个参数 - '%ecx'和'%edx')。它受'-mregparm = 3' [GCC选项](http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html)的控制,它指示编译器使用'%eax', '%edx','%ecx'为前3个参数,依次。这与Borland fastcall约定相似,但仍然如此。 – Eugene 2012-04-09 07:27:32