作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在不使用包含 char* 大小的结构的情况下将 char* 传递给unlocked_ioctl?
最佳答案
参数是什么由驱动程序决定。 KDGETLED是一个已经存在的并且被记录为采用 char *
。它最终是 vt_do_kdskled它将一个字节写入参数指向的地址。
unlocked_ioctl
是ioctl(2)
系统调用的内部实现。 ioctl(2) 的手册指出:
The third argument is an untyped pointer to memory. It's traditionally char *argp (from the days before void * was valid C),
因此,在具有签名 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
的 unlocked_ioctl
中,第三个参数被强制转换为任何驱动程序指定。
您可以在我上面引用的 vt_do_kdskled
示例中看到这一点,其中该参数接受第 2099 行的单字节结果:
int vt_do_kdskled(int console, int cmd, unsigned long arg, int perm)
{
....
case KDGETLED:
ucval = getledstate();
return put_user(ucval, (char __user *)arg);
这个arg
参数是通过来自vt_ioctl的ioctl调用到达这里的。 。它刚刚传递给实现。
关于c - Linux设备驱动程序: Is it possible to pass a char* to unlocked_ioctl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41505481/
我是一名优秀的程序员,十分优秀!