系统调用跨越user space和kernel space,内核无法操作用户空间进程的栈,所以系统调用的参数传递采用寄存器方式。由于可变参数函数的基础是参数通过栈传递,因而寄存器参数传递是无法实现可变参数函数的。
可是系统调用ioctl函数的声明却是一个可变参数形式:
int ioctl(int fildes, unsigned long request, ...);
而对应的内核函数sys_ioctl的声明是这样子的:
asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
(注:上边regparm的意思就是说,参数是通过寄存器传递的)
内核中的ioctl是3个参数,那就说明了用户控件中的ioctl也应该是三个参数。之所以使用“…”作为第三个参数,其实是为了避免编译器的类型检查,你也可把这个当成一个小技巧来用哦,不过这种技巧回削弱代码的安全性,需要自己权衡了。
sxg
阅读(1734) | 评论(0) | 转发(0) |