Архитектура — 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);
Я не могу связать это значение с тем, как оно интерпретируется. Может ли кто-нибудь помочь мне понять, почему размер структуры не меняется должным образом и почему значение хвоста не такое, как ожидалось?
В обработчике ioctl для копирования используется copy_from_user, а содержимое побайтно поступает как ожидается
Подробнее здесь: https://stackoverflow.com/questions/788 ... -in-kernel
Мобильная версия