4

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

void custom_function(int arg);

系统调用号在哪里arg,然后在某处entry_32.S能够做到:

称呼custom_function

4

1 回答 1

1

由于汇编函数和 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 */

在被调用方:

asmlinkage int my-function(int arg1, int arg2, int arg3, ...) {
   <your code>;
   return 0;
}
于 2012-12-12T01:36:03.657 回答