c - 将结构数组从用户空间传递到内核空间然后再返回时遇到问题

标签 c struct kernel xv6

我正在尝试创建一个简单的顶级实用程序 xv6。为此,我创建了一个系统调用,允许我访问内核空间。我遵循了许多关于如何创建系统调用的指南,并且我的代码编译没有问题。

当我尝试在 qemu 中运行 top 时,出现了问题。每当我尝试访问我的结构体数组时,无论它是在内核空间还是用户空间,我都会收到 trap 14 错误。

为了稍微分解一下,我有一个 top.c 文件:

...
int main(){
  struct uproc table[MAX];//where MAX is defined as 10
  if(!getprocs(MAX, table))
     printf("YAY");
...

在 sysproc.c 中:

...
int
sys_getprocs(int max, struct uproc table[]){
    return gettable(table);
}

然后在 procs.c 中

....
int gettable(struct uproc table[]){
    struct uproc u;
    struct proc *p;
    int i = 0;
    aquire(&ptable.lock);
    for(p->state.proc; p < &ptable.proc[NPROC];p++){
        if(//p->state is valid){
           u.state = p->state;
           ...
           table[i] = u;//where I get the trap 14 error
        }
    }
}

同样,我的假设是,当我将表从用户传递到内核时,它会被损坏,但话虽如此,我不确定如何正确传递它。

最佳答案

所有 xv6 sys_* 函数都是无参数的。 阅读 argintargstrargptr 函数,了解如何从用户模式向内核传递参数,

关于c - 将结构数组从用户空间传递到内核空间然后再返回时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256667/

相关文章:

更改代码流程

objective-c - 结构体中的结构体数组 [Objective-c]

c - 简单的 C 内核 char 指针不工作

具有多种结构的 JSONEncoder

linux - 将系统调用编写为内核模块

c - 确保系统调用中的 UID/GID 检查在 RCU 临界区中执行

c - 游程代码解码中数组的奇怪行为

c - C语言中如何在一个输入中获取多个字符

python - 如何在C和Python之间交换时间

c - 在 C 中用另一个变量命名一个变量