copy_from_user получает неожиданные данные

Я хочу использовать системный вызов записи для копирования структуры из пространства пользователя в ядро.
И в пространстве пользователя, и в пространстве ядра структура определяется как

struct packet{
    unsigned char packet[256];
    int length;
}__attribute__ ((packed));

Пространство пользователя использует локальную переменную типа struct packet и передает ее системному вызову записи.

struct packet p;
/* ... (fill in data)  */
printf("packet.length: %d\n",packet.length); /* looks correct */
result = write(uartFD, &p, sizeof(struct packet));

Сторона ядра выглядит так, проверка на правильную длину выполнена, просто удалено из примера.

/* write syscall */
ssize_t packet_write(
    struct file *file_ptr,
    const char __user *user_buffer,
    size_t count, loff_t *position)
{

struct packet p;
int retval;

if (copy_from_user((void*)&p, user_buffer, sizeof(struct packet))){
    retval = -EACCES;
    goto err;
}

/* looks wrong - different numbers like 96373062 or 96373958 */
printk("packet length: %d\n",p.length); 

Обратное направление с использованием системного вызова чтения работает, как и ожидалось:

 /* read syscall */
struct packet p;
/* ... (fill in data)  */
copy_to_user(user_buffer, (void*)&p, sizeof(struct packet));

/* userspace */
read(uartFD, (void*)&packet, sizeof(struct packet));

Что я делаю неправильно с записью системного вызова?


person Eric Grunt    schedule 03.06.2016    source источник
comment
Выполните дополнительную отладку: что, если вы напишете 256-байтовый буфер, заполненный счетчиком (0,1,2,3 и т. д.)? Что, если вы отправите только длину в виде 4-байтового целого числа? Это проблема форматирования или выравнивания или фундаментальная проблема с передачей данных через границу пользователя/ядра?   -  person Peter    schedule 03.06.2016


Ответы (1)


(Опубликовано от имени OP).

Это решаемо - это была моя собственная глупость. Копирование целочисленного и беззнакового символьного буфера по отдельности работало, поэтому это должно было быть что-то в структуре.

Один сайт был запакован, другой нет... переиспользование старого кода...

person Community    schedule 03.06.2016