发博文
Welcome to 宋贤广's blog

sxg.blog.chinaunix.net

骤雨过,珍珠乱糁,打遍新荷   
个人资料
  • 博客访问:441385
  • 博文数量:195
  • 博客积分:8011
  • 博客等级:中将
  • 注册时间:2007-12-09 22:03:37
订阅我的博客
  • 订阅
  • 订阅到鲜果
  • 订阅到抓虾
  • 订阅到Google
字体大小: 博文
分类: C


系统调用跨越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
 

亲,您还没有登录,请[登录][注册]后再进行评论