是否可以在不使用包含char *大小的结构的情况下将char *传递给unlocked_ioctl?
答案 0 :(得分:1)
由驱动程序决定参数是什么。 KDGETLED已经存在,并记录为char *
。它最终在vt_do_kdskled中,它将一个字节写入参数指向的地址。
unlocked_ioctl
是ioctl(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调用到达此处。它只是传递给实现。