C 无法将带有字符串的数组从内核空间返回到用户空间linux

C 无法将带有字符串的数组从内核空间返回到用户空间linux,c,linux,linux-kernel,driver,C,Linux,Linux Kernel,Driver,我在内核空间中有这段代码,当程序从用户空间读取文件/dev/myprogram时调用: char **array = kmalloc(5, GFP_KERNEL); int i; for (i = 0; i < 5; ++i) { array[i] = kmalloc(100, GFP_KERNEL); } strcpy(array[0], "aaa"); strcpy(array[1], "fooyes"); strcpy(array[2], "

我在内核空间中有这段代码,当程序从用户空间读取文件/dev/myprogram时调用:

  char **array = kmalloc(5, GFP_KERNEL);
  int i;
  for (i = 0; i < 5; ++i) {
      array[i] = kmalloc(100, GFP_KERNEL);
  }

  strcpy(array[0], "aaa");
  strcpy(array[1], "fooyes");
  strcpy(array[2], "bbdfdfb");
  strcpy(array[3], "ccc1234");
  strcpy(array[4], "csddbbbbbcc");

  copy_to_user(buffer, array, 500);
char**array=kmalloc(5,GFP_内核);
int i;
对于(i=0;i<5;++i){
数组[i]=kmalloc(100,GFP_内核);
}
strcpy(数组[0],“aaa”);
strcpy(数组[1],“fooyes”);
strcpy(数组[2],“bbdfb”);
strcpy(数组[3],“ccc1234”);
strcpy(数组[4],“csddbbcc”);
将_复制到_用户(缓冲区,数组,500);
用户空间中的代码,必须从内核空间获取列表:

 #define BUFFER_LENGTH 500
    char** receive;

    int main(int argc, char* argv[])
    {
       int fd;
       fd = open("/dev/myprogram", O_RDWR);
        receive = malloc(5 * sizeof(char *));
        int i;
        for (i = 0; i < 5; ++i) {
           receive[i] = (char *)malloc(100+1);
        }
        read(fd, receive, BUFFER_LENGTH);
       for(i = 0; i < 5; i++)
       {
         printf("The received message is : [%s] \n", receive[i]);
       }
#定义缓冲区长度500
字符**接收;
int main(int argc,char*argv[])
{
int-fd;
fd=打开(“/dev/myprogram”,O_RDWR);
接收=malloc(5*sizeof(char*);
int i;
对于(i=0;i<5;++i){
接收[i]=(字符*)malloc(100+1);
}
读取(fd、接收、缓冲区长度);
对于(i=0;i<5;i++)
{
printf(“收到的消息是:[%s]\n”,receive[i]);
}

当我试图获取这个字符串数组时,内核中出现了分段错误,没有显示任何内容。请帮助我找到传递整个列表的方法。有更好的方法吗?

您只复制指针并尝试获取500字节,而只分配了5个字节。这对于64个数组中的一个指针都不够位系统和32位系统中的一位。这肯定会崩溃,因为你在多个地方越界。嘿,谢谢你的回答。你能帮我解决这个问题吗?如何复制所有数据?为整个数据分配足够的内存作为一个内存区域,将字符串连接到其中,复制出来,你的意思是,我必须使用char*Data而不是char**?并将所有数据推送到char*数据中,然后使用copy_to_user函数将其传递给用户?是的,没错。这还取决于您编写的实际其他代码。如果是char设备,则应该有一个读取方法,您可以在其中复制合适的部分等。因此,在看不到整个设备代码的情况下,无法准确地说出来。您只是一个copying指针并尝试获取500字节,而您只分配5字节。这对于64位系统中的一个指针和32位系统中的一个指针都是不够的。这肯定会崩溃,因为您在多个位置越界。嘿,谢谢您的回答。您能帮我解决这个问题吗?如何复制所有数据?分配足够的内存对于作为一个内存区域的整个数据,将字符串连接到其中,将其复制出来,kfree it你的意思是,我必须使用char*data而不是char**?并将所有数据推送到char*data,然后使用copy_to_user函数传递它?是的,没错。这还取决于你编写的其他实际代码。如果是char设备,应该e一种读取方法,在这种方法中,您可以复制出合适的部分等,因此在没有看到整个设备代码的情况下,无法准确地说出。