我正在实现一个系统调用处理程序,它在堆栈上接收系统调用的数量及其参数。处理系统调用的函数具有不同的返回类型,不同数量的参数和不同的参数类型。
我通过定义包含函数指针的struct
来抽象被调用的函数,我正在传递系统调用号。
我不知道如何抽象参数传递,意思是:
a)参数转换
b)不同数量的参数
c)持有/不持有返回值
到目前为止我唯一的想法是涉及大量的代码重复。 有没有办法做到这一点并尽可能避免切换语句?
答案 0 :(得分:1)
一些可能的路线:
使用C变量函数:http://en.wikipedia.org/wiki/Variadic_function#Example_in_C这里的一个早期参数指定了预期的附加参数类型(非常类似于printf
)。
使用'调用类型'参数和void *
参数,后者根据调用类型进行适当投射。
使用指向结构的指针,该结构包含调用类型,以及void *
,或union
或零长度字节数组(同样最终会被转换为正确的struct
)。
答案 1 :(得分:0)
看看如何Linux做到了。系统调用用户端由一组宏处理,每个数字或参数对应一个(幸运的是,这不是带有庞大的参数列表的Windows)。有关一些想法,请参阅syscall(2)
。也许还可以看看BSD的方式。
基本上,在Linux中发生的事情(在i686上,没有真正研究过x86_64)是系统调用号(这定义了参数的数量和类型)在寄存器中传递,其他寄存器中的一些其他参数,特别是堆栈上的一些。系统调用号用于索引到函数表中,以便在为调用设置正确的参数后执行脏工作。