copy_to_user и copy_from_user со структурами - PullRequest
1 голос
/ 10 декабря 2011

У меня простой вопрос: когда мне нужно скопировать содержимое структуры из пространства пользователя в пространство ядра, например, с помощью вызова ioctl (или наоборот) (для простоты в коде нет проверки ошибок):

typedef struct my_struct{
 int a;
 char b;
} my_struct;

Местоположение пользователя:

my_struct s;
s.a = 11;
s.b = 'X';

ioctl(fd, MY_CMD, &s);

ядра системы:

int my_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
             unsigned long arg)
{
...
    my_struct ks;
    copy_from_user(&ks, (void __user *)arg, sizeof(ks));
...
}

Я думаю, что размер структуры в пользовательском пространстве (переменная s) и пространстве ядра (переменная ks) могут быть не одинаковыми (без указания __attribute__((packed))). Так правильно ли указывать количество байтов в copy_from_user с макросом sizeof? Я вижу, что в исходных кодах ядра есть некоторые структуры, которые не объявлены упакованными, поэтому как обеспечить тот факт, что размер будет одинаковым в пространстве пользователя и в пространстве ядра?

Спасибо всем!

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Структура пространства пользователя должна исходить из заголовка ядра, поэтому определение структуры должно быть одинаковым в пространстве пользователя и ядра. У вас есть реальный пример?

Конечно, если вы играете с разными вариантами упаковки на двух сторонах ABI, что бы это ни было, у вас проблемы. Проблема здесь не в размерах.

Если ваш вопрос: влияют ли параметры упаковки на двоичный интерфейс, ответ - да. Если ваш вопрос, как я могу устранить несоответствие упаковки, пожалуйста, предоставьте дополнительную информацию

1 голос
/ 10 декабря 2011

Почему расположение структуры должно отличаться в пространстве ядра от пространства пользователя? У компилятора нет оснований для разметки данных по-другому. Исключением является то, что userpace - это 32-битная программа, работающая на 64-битном ядре. См. http://www.x86 -64.org / pipermail / обсуждения / 2002-июнь / 002614.html , чтобы узнать, как справиться с этим.

...