为什么copy_to_user打印不正确的结果?

时间:2014-05-09 18:24:38

标签: c linux linux-kernel

我有一个邮箱链表,我试图将他们的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 = &currentBox->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中给出的大小参数太大了,但自那以后似乎并非如此。我不知道出了什么问题,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

您似乎在内核部分使用sizeof toUser,但实际上正在toUser复制指向的数据。

这是错误的。您正在从指针字节大小的int复制。

我建议使用sizeof *toUser,但您可能需要sizeof(*toUser)

这样的括号