Реальное значение 3-го параметра _IOR - PullRequest
0 голосов
/ 29 мая 2019

У меня есть один драйвер и демон, драйвер доступа к демону, использующий 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_A и TEST_GET_NUM_B работают хорошо, сбоев не происходит. Мой вопрос, какой из них правильный, или оба?

_IOR(type,nr,size) size означает размер 3-го параметра в ioctl(fd, TEST_GET_NUM_A/B, &num_keys) или означает размер данных, передаваемых из ядра в пространство пользователя?

1 Ответ

2 голосов
/ 29 мая 2019

Размер шрифта становится частью числа ioctl. Это предназначено для обнаружения ошибок, когда ядро ​​и пользовательское пространство случайно используют разные типы (или разные определения одного и того же типа).

Но это поле не влияет на поведение ioctl (если ваш драйвер не читает его явно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...