Я хочу использовать системный вызов записи для копирования структуры из пространства пользователя в ядро.
И в пространстве пользователя, и в пространстве ядра структура определяется как
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));
Что я делаю неправильно с записью системного вызова?