Проблема с 32-битной совместимостью структуры ioctl в ядреLinux

Ответить
Anonymous
 Проблема с 32-битной совместимостью структуры ioctl в ядре

Сообщение Anonymous »

У меня есть структура, определенная для связи ioctl между ядром и пространством пользователя:
Архитектура — ARM64
Ядро — 64 бита, а пространство пользователя — 32.

Код: Выделить всё

struct test_seg {
uint8_t a;
int i;
int p;
uint8_t global;
uint8_t num;
uint32_t size;
uint32_t reserved1;
uint16_t reserved2;
uint8_t reserved3;
uint64_t tail;
};
Поле хвоста содержит адрес, выделенный из пользовательского пространства.
Для поддержки 32-битной совместимости для ioctl при перемещении пользовательского пространства в 32-битное. ожидается, что размер структуры изменится с 40 до 36 байт. Однако размер по-прежнему отображается как 40 байт как в ядре, так и в пользовательском пространстве.
Кроме того, при обработке ioctl совместимости значение хвоста, которое содержит 32-битный адрес из пользовательское пространство не является ожидаемым значением, присвоенным пользовательским пространством.
Я создал программу для проверки 32-битного пользовательского контента и ядра:

Код: Выделить всё

struct test_seg var_64;
uint8_t *p = (uint8_t *)&var_64;
for (int i = 0; i < sizeof(struct test_seg); i++) {
p[i] = base + (i % 15);
printf("p[%d]: val: %d\n", i, p[i]);
}
printf("tail: %p\n", (void *)var_64.tail);

Когда я печатаю значение хвоста, оно показывает 6befe0af.
Я не могу связать это значение с тем, как оно интерпретируется. Может ли кто-нибудь помочь мне понять, почему размер структуры не меняется должным образом и почему значение хвоста не такое, как ожидалось?
В обработчике ioctl для копирования используется copy_from_user, а содержимое побайтно поступает как ожидается

Подробнее здесь: https://stackoverflow.com/questions/788 ... -in-kernel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»