有没有一种方法可以将参数传递给C函数?

时间:2014-03-07 17:43:38

标签: c system-calls

我正在实现一个系统调用处理程序,它在堆栈上接收系统调用的数量及其参数。处理系统调用的函数具有不同的返回类型,不同数量的参数和不同的参数类型。

我通过定义包含函数指针的struct来抽象被调用的函数,我正在传递系统调用号。

我不知道如何抽象参数传递,意思是:

a)参数转换

b)不同数量的参数

c)持有/不持有返回值

到目前为止我唯一的想法是涉及大量的代码重复。 有没有办法做到这一点并尽可能避免切换语句?

2 个答案:

答案 0 :(得分:1)

一些可能的路线:

  1. 使用C变量函数:http://en.wikipedia.org/wiki/Variadic_function#Example_in_C这里的一个早期参数指定了预期的附加参数类型(非常类似于printf)。

  2. 使用'调用类型'参数和void *参数,后者根据调用类型进行适当投射。

  3. 使用指向结构的指针,该结构包含调用类型,以及void *,或union或零长度字节数组(同样最终会被转换为正确的struct)。

答案 1 :(得分:0)

看看如何Linux做到了。系统调用用户端由一组宏处理,每个数字或参数对应一个(幸运的是,这不是带有庞大的参数列表的Windows)。有关一些想法,请参阅syscall(2)。也许还可以看看BSD的方式。

基本上,在Linux中发生的事情(在i686上,没有真正研究过x86_64)是系统调用号(这定义了参数的数量和类型)在寄存器中传递,其他寄存器中的一些其他参数,特别是堆栈上的一些。系统调用号用于索引到函数表中,以便在为调用设置正确的参数后执行脏工作。