Linux kernel 在Linux内核中从条目_32.S调用C函数

Linux kernel 在Linux内核中从条目_32.S调用C函数,linux-kernel,kernel,system-calls,Linux Kernel,Kernel,System Calls,我需要能够在某个地方调用linux内核中定义的自定义函数。创建某些功能需要做什么: void自定义函数(int arg) 其中arg是系统呼叫号码,然后在entry_32.S中的某处可以执行以下操作: 调用自定义_函数,因为汇编函数和C函数的堆栈处理不同。 汇编代码“callq”不能直接调用C例程,调用前需要一段代码将汇编参数放入C堆栈中。 Linux内核源代码中定义的宏“asmlinkage”用于告诉编译器该函数已准备好从程序集调用,编译器将在该C函数的开头添加一些参数放置代码 因此,你必须做

我需要能够在某个地方调用linux内核中定义的自定义函数。创建某些功能需要做什么:

void自定义函数(int arg)

其中
arg
是系统呼叫号码,然后在
entry_32.S
中的某处可以执行以下操作:


调用
自定义_函数

,因为汇编函数和C函数的堆栈处理不同。 汇编代码“callq”不能直接调用C例程,调用前需要一段代码将汇编参数放入C堆栈中。 Linux内核源代码中定义的宏“asmlinkage”用于告诉编译器该函数已准备好从程序集调用,编译器将在该C函数的开头添加一些参数放置代码

因此,你必须做的事情是:

在呼叫端

movq <arg6>,%r9     /* 6th arg */
movq <arg5>,%r8     /* 5th arg */
movq <arg4>,%rcx    /* 4th arg */
movq <arg3>,%rdx    /* 3rd arg */
movq <arg2>,%rsi    /* 2nd arg */
movq <arg1>,%rdi    /* 1st arg*/
callq <your-function-name>
movq %rax, <buf-to-return-result>  /* return value */
movq,%r9/*6th arg*/
movq,%r8/*第五个参数*/
movq,%rcx/*第四个参数*/
movq,%rdx/*第三个参数*/
movq,%rsi/*第二个参数*/
movq,%rdi/*第一个参数*/
callq
movq%rax,/*返回值*/
在被叫方:

asmlinkage int my-function(int arg1, int arg2, int arg3, ...) {
   <your code>;
   return 0;
}
ASMINT我的函数(int arg1、int arg2、int arg3,…){
;
返回0;
}