gpt4 book ai didi

c - 如何将值传递给 XV6 中的系统调用函数?

转载 作者:太空狗 更新时间:2023-10-29 17:07:39 25 4
gpt4 key购买 nike

我正在尝试在 XV6 中创建一个简单的基于优先级的调度程序。为此,我还必须创建一个允许进程设置其优先级的系统调用。我已经完成了创建系统调用所需的一切,如此处和其他地方所讨论的:

how do i add a system call / utility in xv6

问题是,当我调用该函数时,我无法传递任何变量,或者更确切地说,它运行起来好像没有任何问题,但正确的值没有显示在函数内部。

外部声明(syscall.c):

...
extern int sys_setpty(void);

static int (*syscalls[])(void) = {
...
[SYS_setpty] sys_setpty,
};

系统调用 vector (syscall.h):

#define SYS_setpty 22

实现(sysproc.c):

void
sys_setpty(int pid, int pty)
{
cprintf("function pid: %d \n", pid);
cprintf("function pty: %d \n", pty);
}

(defs.h & user.h):

void setpty(int, int);

宏(usys.S):

SYSCALL(setpty)

函数调用:

setpty(3, 50);

输出:

function pid: 16843009
function pty: 16843009

这些值始终是相同的精确数字:16843009。我通过为 pid 和 pty 赋值来检查 cprintf 是否正常工作。我花了大约 6 个小时尝试所有我能想到的所有可能的组合,我开始认为在 XV6 中没有通过系统调用传递值的内置机制。我错过了什么吗?提前谢谢你。

最佳答案

在 XV6 中无法将参数从用户级函数传递到内核级函数。 XV6 有自己的内置函数,用于将参数传递给内核函数。例如,要传递一个整数,调用 argint() 函数。在我用于设置优先级函数的实现中,它看起来像这样:

argint(0, &pid);

...获取进程 ID 的第一个参数,并且:

argint(1, &pty);

... 获取所需优先级的第二个参数。来自用户进程的函数调用如下所示:

setpty(getpid(), priority);

关于c - 如何将值传递给 XV6 中的系统调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27068394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com