如何在内核C程序和用户级C程序之间共享数据?

如何在内核C程序和用户级C程序之间共享数据?,c,linux-kernel,kernel,C,Linux Kernel,Kernel,我正在使用Ubuntu9.04和内核2.8.32。我创建了一个简单的系统调用,用于计算和调用的数量。当用户/shell调用此系统调用时,我希望它将这两个值传递回用户。截至目前,我正在使用: #include <linux/sched.h> #include <linux/asmlinkage> /* These two variables are extern longs which are defined in sched.h and initialized in p

我正在使用Ubuntu9.04和内核2.8.32。我创建了一个简单的系统调用,用于计算和调用的数量。当用户/shell调用此系统调用时,我希望它将这两个值传递回用户。截至目前,我正在使用:

#include <linux/sched.h>
#include <linux/asmlinkage>

/* These two variables are extern longs which are defined in sched.h and initialized in process_32.c */

total_execve;
total_clones;

long mycall* (int i){
    int array[2];
    array[0] = total_execve;
    array[1] = total_clones;
    return array;
}
#包括
#包括
/*这两个变量是外部变量,在sched.h中定义,在process_32.c中初始化*/
总执行次数;
克隆总数;
长mycall*(int i){
int数组[2];
数组[0]=总执行次数;
数组[1]=总克隆数;
返回数组;
}
我无法编译它,因为我得到了一个未定义的引用


关于返回数组:我的新调用是否能够访问数组,数组是否位于内核内存中

不要将指针返回堆栈。让调用方将指针传递到函数中。此外,函数声明语法不正确。以下是您想要做的:

void mycall (int *execve, int *clones)
{
    *execve = total_execve;
    *clones = total_clones;
}

首先回答最后一个问题:数组确实在“内核”内存中,但它是堆栈分配的,这意味着当mycall()函数退出时它将“消失”。您的功能可能看起来正常,但在内存被快速重用的情况下可能会失败


要返回多个值,常见的模式是调用方将指针传递到用户空间内存,并使用内核例程填充它们。例如,您可以为两个值传入两个指针,或者定义一个包含所需值并由内核例程填充的结构。

您不能以这种方式返回数组。您需要声明static关键字以返回本地数组函数。你可以这样做:

int *mycall (int i) {
    static int array[2];
    array[0] = total_execve;
    array[1] = total_clones;
    return array;        
}

您不应该使用copy_to_user和copy_from_user helper函数吗?