我正在使用内核2.8.32的Ubuntu 9.04。我创建了一个简单的系统调用,用于计算clone和execve调用的数量。当用户/ 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;
}
由于我得到一个未定义的引用,我无法编译它。
关于返回数组:我的新调用是否能够访问数组,数组不会位于内核内存中吗?
答案 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;
}