我想使用write sycall来复制struct 从用户空间到内核 在用户和内核空间中,结构定义为
struct packet{
unsigned char packet[256];
int length;
}__attribute__ ((packed));
用户空间使用struct packet类型的局部变量并将其传递给write syscall。
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 sycall的相反方向正如预期的那样工作:
/* 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));
写syscall我做错了什么?
答案 0 :(得分:0)
(代表OP发布)。
这已经解决了 - 这是我自己的愚蠢。分别复制一个整数和一个unsigned char缓冲区都有效,所以它必须是关于struct的东西。
一个网站被打包,另一个网站没有......重用旧代码......