Chinaunix首页 | 论坛 | 博客
  • 博客访问: 917064
  • 博文数量: 194
  • 博客积分: 7991
  • 博客等级: 少将
  • 技术积分: 2067
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-09 22:03
文章分类

全部博文(194)

文章存档

2010年(8)

2009年(71)

2008年(109)

2007年(6)

我的朋友

分类: C/C++

2008-07-05 11:22:37

系统调用跨越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) |
给主人留下些什么吧!~~