【问题标题】:Calling C function from entry_32.S in Linux Kernel在 Linux 内核中从 entry_32.S 调用 C 函数
【发布时间】:2012-11-16 14:46:07
【问题描述】:

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

void custom_function(int arg);

其中arg 是系统调用号,然后在entry_32.S 的某处可以做到:

致电custom_function

【问题讨论】:

标签: linux-kernel kernel system-calls


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2012-07-21
    相关资源
    最近更新 更多