当前位置:  开发笔记 > 运维 > 正文

将数据从内核空间复制到用户空间

如何解决《将数据从内核空间复制到用户空间》经验,为你挑选了1个好方法。

我正在尝试进行自定义系统调用.

我的系统调用需要2个参数struct buffer **mybuffer&int size.

它会强加任何**mybuffer应该反映在用户空间中的变化,但似乎它不起作用.

所以我在其他地方看到过我可以copy_to_user(void *dest, void *src, int size)用来将数据从内核空间复制到用户空间.

在用户空间中,我有一个名为buffer的结构,此结构在系统调用中也是相同的.

typedef struct buffer {
int n;
}buffer;

    int main(void)
   {
     buffer **buf = malloc(sizeof(buffer *));
     int i = 0
for(;i<8;i++)
buf[i] = malloc(sizeof(buffer));
    long int sys = systemcall(801,buf,8)
//print out buf 
   return 0;
   }

在系统调用我有

asmlinkage long sys_something(buffer **buf,int size)
{
//allocate buffer same as it appears in int main
//fill buf with some data
for(i = 0; i

我很确定我做错了什么.如何将数据从内核空间复制到用户空间?

Ps我正在使用Linux内核3.16.0



1> Martin Zabel..:

该函数copy_to_user用于将数据从内核地址空间复制到用户程序的地址空间.例如,将已分配的缓冲区复制kmalloc到用户提供的缓冲区.

编辑:您的示例有点复杂,因为您传递了一系列指向系统调用的指针.要访问这些指针,您必须buf首先使用将数组复制到内核​​空间copy_from_user.

因此,您的内核代码应如下所示:

asmlinkage long sys_something(buffer **buf, int size)
{
    /* Allocate buffers_in_kernel on stack just for demonstration.
     * These buffers would normally allocated by kmalloc.
     */
    buffer buffers_in_kernel[size];
    buffer *user_pointers[size]; 
    int i;
    unsigned long res;

    /* Fill buffers_in_kernel with some data */
    for (i = 0; i < size; i++)
        buffers_in_kernel[i].n = i;  /* just some example data */

    /* Get user pointers for access in kernel space. 
     * This is a shallow copy, so that, the entries in user_pointers 
     * still point to the user space.
     */
    res = copy_from_user(user_pointers, buf, sizeof(buffer *) * size);
    /* TODO: check result here */

    /* Now copy data to user space. */
    for (i = 0; i < size; i++) {
         res = copy_to_user(user_pointers[i], &buffers_in_kernel[i], sizeof(buffer));
         /* TODO: check result here */
    }
}

最后但并非最不重要的是,你的main功能有一个错误.在第一次malloc调用时,它只为1个指针而不是8分配足够的空间.它应该是:

int main(void)
{
  const int size = 8;
  buffer **buf = malloc(sizeof(buffer *) * size);
  for(int i=0; i

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有