我有一个邮箱链表,我试图将他们的ID复制到用户空间变量mbxList
,但它没有正确打印出来。
asmlinkage long sys_listMailboxes(unsigned long * mbxList,
unsigned long K)
{
int counter = 0;
MBOX * currentBox;
unsigned long * toUser;
list_for_each_entry(currentBox, &mailbox_list, list)
{
if(counter != K)
{
printk("The id is: %lu\n", currentBox->id);
toUser = ¤tBox->id;
copy_to_user(mbxList, toUser, sizeof toUser);
mbxList++;
counter++;
}
}
return counter;
}
当我使用dmesg
检查内核中的打印件时,我看到了正确的输出:
The id is: 1111
但是在用户空间中,当我尝试将其打印出来时,我得到输出:
The id is: 1474660693
这是不正确的。
实现此系统调用的C代码段如下:
#include <stdio.h>
#include <unistd.h>
#include <syscall.h>
long listMbox(unsigned long * mbxList, unsigned long K)
{
return syscall(__NR_listMailboxes, mbxList, K);
}
int main(void)
{
unsigned long * mbxlist;
unsigned long K = 2;
listMailboxes(mbxlist, K);
int i;
for(i = 0; i < K; i++)
{
printf("Mailbox id is: %lu\n", *mbxList);
mbxList++;
}
}
我每次都得到相同的1474660693
号码,所以我不认为它是一个内存地址。我以为我在copy_to_user
中给出的大小参数太大了,但自那以后似乎并非如此。我不知道出了什么问题,我将不胜感激。谢谢!
答案 0 :(得分:1)
您似乎在内核部分使用sizeof toUser
,但实际上正在toUser
复制指向的数据。
这是错误的。您正在从指针字节大小的int复制。
我建议使用sizeof *toUser
,但您可能需要sizeof(*toUser)