LINUX.ORG.RU

IOCTL

 ,


0

1

Знатоки, нужна ваша помощь. Некоторое время назад написал свой первый драйвер ядра, для версии ядра 4.15. Использовал функции ioctl (чтение системного времени из ядра) в пользовательском интерфейсе все запускалось. Сейчас поставил новую систему с ядром версии 4.18 и возникла проблема. При попытке вызова функции возникал kernelpanic. Изменил unlocked_ioctl на compat_ioctl, kernelpanic пропал, но в функция ioctl не запускается. С чем это может быть связано или как протестировать, чтобы понять в чем проблема? Если написал не туда прошу простить и сильно не ругаться.

// Файловые операции поддерживаемые устройством
static struct file_operations fops = {
    .owner = THIS_MODULE,
    .read = device_read,
    .write = device_write,
    .compat_ioctl = device_ioctl,
    .open = device_open,
    .release = device_release
};
 
static long device_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
{/* ... */
    switch (cmd) {
/* ... */
        case TIME_IOCREAD:
            ret = read_time((struct my_date *)arg);
            break;
    }
    return ret;
}

// Вызов функции пользователем
void time_device::read_time_from_dev(struct my_date *user_date)
{
    qDebug() << "READ_TIME";
    if (!is_Open()) {
        qDebug() << "device not open";
        return;
    }
    ioctl(_devHandel,TIME_IOCREAD, user_date);
}

Перемещено tailgunner из general



Последнее исправление: chesnoksatan (всего исправлений: 3)

Без кода и сообщения о панике вряд ли тебе кто-то поможет.

tailgunner ★★★★★
()

Изменил unlocked_ioctl на compat_ioctl

Я не настоящий сварщик, но вроде compat_ioctl - это отдельная функция, которая вызывается, когда ioctl() делает 32-разрядный код из юзерспейса в 64-разрядное ядро. То есть нельзя просто так заменить одно на другое и ожидать, что всё волшебным образом заработает.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.