【问题标题】:Real meaning of the 3rd parameter of _IOR_IOR第三个参数的真正含义
【发布时间】:2019-05-29 22:33:46
【问题描述】:

我有一个驱动和守护进程,守护进程访问驱动使用ioctl,我对_IOR的第三个参数有点困惑:

#define _IOR(type,nr,size)  _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))

我有一些代码如下, ioctl cmd 定义:

#define TEST_GET_NUM_A  _IOR(TESTIO, 0x01, uint8_t *)
#define TEST_GET_NUM_B  _IOR(TESTIO, 0x02, uint8_t)

ioctl 在驱动程序中:

case TEST_GET_NUM_A:
    rc = put_user(data->num_keys, (uint8_t __user *) arg);
    break;
case TEST_GET_NUM_B:
    rc = put_user(data->num_keys, (uint8_t __user *) arg);
    break;

ioctl 在守护进程中:

uint8_t num_keys = 0;
rc = ioctl(fd, TEST_GET_NUM_A/TEST_GET_NUM_B, &num_keys);
if (rc < 0) {
    ALOGE("ioctl failed %d", rc);
    close(fd);
    return rc;
}

TEST_GET_NUM_ATEST_GET_NUM_B 都运行良好,不会发生崩溃。 我的问题是哪一个是正确的,还是两者都正确?

_IOR(type,nr,size) size 是指ioctl(fd, TEST_GET_NUM_A/B, &amp;num_keys) 中第三个参数的大小,还是指从内核传递到用户空间的数据大小?

【问题讨论】:

    标签: c linux linux-kernel


    【解决方案1】:

    类型的大小成为 ioctl 编号的一部分。这旨在捕获内核和用户空间意外使用不同类型(或同一类型的不同定义)的错误。

    但该字段对 ioctl 的行为没有影响(除非您的驱动程序明确读取它)。

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多