Я использую драйвер CUSE для одного из моих проектов, где я создал свои собственные IOCTL.
После передачи указателя на структуру из пространства процесса я успешно могу извлечь ее в пространстве CUSE, используя:
in_iov[0].iov_base = arg;
in_iov[0].iov_len = sizeof(struct my_struct);
if (!in_bufsz) {
fuse_reply_ioctl_retry(req, in_iov, 1, NULL, 0);
return;
}
my_struct *ptr = in_buf;
in_buf += sizeof(struct my_struct);
in_bufsz -= sizeof(struct my_struct);
Проблема возникает в следующем месте, указатель на только что найденную структуру указывает на указатель данных, размер которого может быть от 0 до 2 ^ 28
in_iov[1].iov_base = ptr->data_buf_ptr;
in_iov[1].iov_len = ptr->data_buf_size;
if (!in_bufsz) {
fuse_reply_ioctl_retry(req, in_iov, 2, NULL, 0);
return;
}
, который должен работать, как ожидается, с возвращением полезного указателя в in_buf.
Тем не менее, при наблюдении, похоже, что если ptr-> data_buf_size> 127,000, драйвер падает.
Мне не удалось найти ссылку, которая бы объясняла такую ограниченность размера передачи данных,
Кроме того, использование нескольких fuse_reply_ioctl_retry с меньшими размерами буфера ниже 127000 на нескольких итерациях также не работает