Как ioctl() вызывает код драйвера

Я работаю над инструментом тестирования для nvme-cli (написан на c и может работать в Linux).

Для проверки SSD я действительно искал пользовательскую команду (например, для команды ввода-вывода, напишите, а затем прочитайте то же самое и, наконец, сравните, если оба данных одинаковы)

Для чтения используется функция ioctl(), как показано в приведенном ниже коде.

struct nvme_user_io io = {
    .opcode     = opcode,
    .flags      = 0,
    .control    = control,
    .nblocks    = nblocks,
    .rsvd       = 0,
    .metadata   = (__u64)(uintptr_t) metadata,
    .addr       = (__u64)(uintptr_t) data,
    .slba       = slba,
    .dsmgmt     = dsmgmt,
    .reftag     = reftag,
    .appmask    = appmask,
    .apptag     = apptag,
};
err = ioctl(fd, NVME_IOCTL_SUBMIT_IO, &io);

Можно мне куда именно идет контроль исполнения, чтобы понять прочитанное.

Также я хочу иметь другую команду, которая выглядит как

err = ioctl(fd,NVME_IOCTL_WRITE_AND_COMPARE_IO, &io);

чтобы я мог внутренне выполнить запись, затем прочитать одно и то же место и, наконец, сравнить оба данных, чтобы убедиться, что диск содержит только те данные, которые я хотел записать.

Поскольку я новичок в этом nvme/ioctl(), если есть какие-либо ошибки, поправьте меня.


person Arjun G S    schedule 14.12.2017    source источник
comment
Простой greping для NVME_IOCTL_SUBMIT_IO: данный запрос ioctl обрабатывается в drivers/nvme/host/core.c.   -  person Tsyvarev    schedule 14.12.2017
comment
@Tsyvarev, Я могу получить новую команду, добавив случай под названием NVME_IOCTL_WRITE_AND_COMPARE_IO вместо case NVME_IOCTL_SUBMIT_IO: return nvme_submit_io(ns, (void __user *)arg); Я не знаю, работает ли это. На самом деле я не понял, как функция ioctl() вызывает nvme_ioctl() Я не знаю, глупый ли это вопрос, но, поскольку я новичок в этом, я не понял.   -  person Arjun G S    schedule 14.12.2017
comment
Короче говоря, nvme_ioctl() назначается блочному устройству, дескриптор которого вы передаете ioctl() вызову в пользовательском пространстве. Подробное описание читайте о блочных устройствах в ядре linux и написании драйверов для них. Если вы просто хотите добавить поддержку нового типа запроса ioctl, просто сделайте это в функции nvme_ioctl.   -  person Tsyvarev    schedule 14.12.2017


Ответы (1)


nvme_io() — это основной обработчик команд, который принимает в качестве параметра код операции NVMe, который вы хотите отправить на свое устройство. По стандарту у вас есть отдельные команды (опкоды) для чтения, записи и сравнения. Вы можете либо отправить эти команды отдельно, либо добавить команду конкретного поставщика, чтобы вычислить то, что вам нужно.

person Ora    schedule 14.12.2017
comment
Для проверки SSD мы создаем инструмент, мне нужно записать случайный шаблон на диск, прочитать его, а затем сравнить, совпадают ли данные, записанные на диске, с тем, что мы действительно хотели записать. Поскольку мы записываем случайный шаблон, нам нужна пользовательская команда, которая внутренне отправляет запись, а затем читает то же самое. наконец, мы можем проверить содержимое буфера, чтобы проверить, есть ли у нас одинаковое содержимое - person Arjun G S; 18.12.2017
comment
@ArjunGS что ты имеешь в виду под внутренним? Вы можете запустить программу, которая для каждого блока создает случайный шаблон, сохраняет его, отправляет, считывает и сравнивает. Если вам нужно сделать это внутри диска, вам нужно реализовать код на устройстве SSD, а затем вы можете отправить свою пользовательскую команду. Возможно, SSD уже поддерживает такую ​​команду. - person Ora; 19.12.2017
comment
Я хотел добавить в nvme-cli новую команду Write-compare, которая выполняет запись, чтение и сравнение. Но с ioctl() мы не могли сделать повтор с потоками, причина в том, что нам нужно указать другой идентификатор очереди отправки, что не может быть сделано ioctl(). Итак, мы хотим добавить что-то к модулю драйвера. - person Arjun G S; 19.12.2017