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

4

我正在使用内核版本为2.8.32的Ubuntu 9.04。我创建了一个简单的系统调用,用于计算cloneexecve调用的数量。当用户/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;
}

我无法编译这个代码,因为出现了未定义的引用错误。

关于返回数组:我的新调用是否能够访问该数组?该数组不会位于内核内存中吗?

3个回答

5
不要返回指向堆栈的指针。让调用者将指针传递到函数中。此外,您的函数声明语法不正确。以下是您想要执行的操作:
void mycall (int *execve, int *clones)
{
    *execve = total_execve;
    *clones = total_clones;
}

4
首先回答您的最后一个问题:该数组确实在“内核”内存中,但它是堆栈分配的,这意味着当mycall()函数退出时,它将“消失”。您的函数可能看起来正常工作,但在内存被快速重新使用的情况下可能会失败。
为了返回多个值,通常的模式是调用者传递指向用户空间内存的指针,并由内核例程填充它们。例如,您可以传递两个指针以获取两个值,或者定义一个包含所需值并由内核例程填充的单个结构体。

你应该使用copy_to_user和copy_from_user辅助函数,不是吗? - stsquad

0

你不能以这种方式返回一个数组。你需要声明静态关键字来返回一个本地数组函数。你可以像这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接