Linux设备驱动程序:是否可以将char *传递给unlocked_ioctl?

时间:2017-01-06 12:13:07

标签: c linux-kernel linux-device-driver

是否可以在不使用包含char *大小的结构的情况下将char *传递给unlocked_ioctl?

1 个答案:

答案 0 :(得分:1)

由驱动程序决定参数是什么。 KDGETLED已经存在,并记录为char *。它最终在vt_do_kdskled中,它将一个字节写入参数指向的地址。

更新

unlocked_ioctlioctl(2)系统调用的内部实现。 ioctl手册(2)指出:

  

第三个参数是一个指向内存的无类型指针。          它传统上是char * argp(从void *之前的日子开始是有效的C),

所以在具有签名unlocked_ioctl的{​​{1}}中,第三个参数被强制转换为驱动程序指定的内容。

您可以在我上面引用的long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);示例中看到这一点,其中此参数是大小写接受第2099行的单字节结果:

vt_do_kdskled

int vt_do_kdskled(int console, int cmd, unsigned long arg, int perm) { .... case KDGETLED: ucval = getledstate(); return put_user(ucval, (char __user *)arg); 参数通过vt_ioctl的ioctl调用到达此处。它只是传递给实现。