У меня простой вопрос: когда мне нужно скопировать содержимое структуры из пространства пользователя в пространство ядра, например, с помощью вызова 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
? Я вижу, что в исходных кодах ядра есть некоторые структуры, которые не объявлены упакованными, поэтому как обеспечить тот факт, что размер будет одинаковым в пространстве пользователя и в пространстве ядра?
Спасибо всем!