【发布时间】:2012-04-21 02:59:20
【问题描述】:
我需要编写一个 C 函数,该函数将从 linux 内核中的汇编代码中调用。
应该考虑哪些特殊问题?
我有一些想法,但谁能提供更多细节:
(1) 调用约定
确保汇编中的调用者和c中的被调用者握手良好。但是我应该使用哪种调用约定?如何声明c函数并在汇编代码中声明?
(2) 保护寄存器
在调用之前,一些寄存器应该保存在程序集中。我大致记得它们是eax,ecx和edx。但是我不必保存它们,除非我需要在调用 C 函数之前引用旧值,对吧?
还有什么问题?
【问题讨论】:
-
"我需要编写一个 C 函数,该函数将从 linux 内核的汇编代码中调用。" - 是什么阻止了你?
-
@MitchWheat 具体来说,我不知道声明 c 函数时“asmlinkage”的确切用法。我必须使用它吗?还有其他选择吗?这意味着什么?
-
首先 - 尽量不要这样做。 Linux 在一些地方使用汇编,而且它们都很难处理。我认为问题取决于它是什么汇编代码。在中断处理程序的早期阶段运行,或在早期启动阶段(使用 C 的两个示例)是两件不同的事情。
-
asmlinkage表示所有参数都通过堆栈传递。而 IIRCasmlinkage对 64 位代码什么也不做。 -
制作一个包含函数的简单库。制作一个调用库的 hello 程序。大多数玩具编译器都带有一个测试库和 hello 程序。使用 gdb 之类的调试器对它们进行反汇编,并注意参数是如何传递的。
标签: c assembly linux-kernel inline-assembly