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

时间:2011-02-11 21:10:30

标签: c linux-kernel kernel

我正在使用内核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 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

首先回答你的上一个问题:数组确实在“内核”内存中,但它是堆栈分配,这意味着当mycall()函数退出时它会“消失”。您的功能似乎可以正常工作,但在内存重新快速使用的情况下可能会失败。

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

答案 2 :(得分:0)

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

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