Operating system 将用户给定的参数保存在xv6中的寄存器中
我们应该向xv6操作系统添加一个系统调用,该调用计算给定数字的位数。 为此,我们应该将数字保存在寄存器中,然后生成一个函数,从寄存器中读取该参数,并将其传递给处理系统调用逻辑的函数。Operating system 将用户给定的参数保存在xv6中的寄存器中,operating-system,xv6,Operating System,Xv6,我们应该向xv6操作系统添加一个系统调用,该调用计算给定数字的位数。 为此,我们应该将数字保存在寄存器中,然后生成一个函数,从寄存器中读取该参数,并将其传递给处理系统调用逻辑的函数。 我的问题是:我们应该如何将用户给出的参数保存在寄存器中?在xv6中有一些通用寄存器,可以用于在用户程序中读取和写入。c中没有将int值写入寄存器的函数,但可以使用内联汇编c来实现。 例如,如果您的变量是a,并且希望将其保存在eax寄存器中,则可以使用以下代码: asm ("movl %0, %%eax;"
我的问题是:我们应该如何将用户给出的参数保存在寄存器中?在xv6中有一些通用寄存器,可以用于在用户程序中读取和写入。c中没有将int值写入寄存器的函数,但可以使用内联汇编c来实现。 例如,如果您的变量是a,并且希望将其保存在eax寄存器中,则可以使用以下代码:
asm ("movl %0, %%eax;"
: /* no output */
:"r"(a) /* input is variable a */
:"%eax" /* clobbered register */
);
有关如何使用内联c程序集写入寄存器的更多信息,请阅读本网站:当用户想要使用系统调用时,他会将其作为函数使用,例如:
kill(int)
:
在usys.S中,kill
定义为:
SYSCALL(kill)
翻译成
.globl kill;
kill:
movl $SYS_ ## open, %eax;
int $T_SYSCALL;
ret
因此,当用户调用kill
时,中断处理程序将启动sys\u kill
:
int
sys_kill(void)
{
int pid;
if(argint(0, &pid) < 0)
return -1;
return kill(pid);
}
count\u digit
您确定您的意思不是将该号码作为系统调用的参数接收?这是否回答了您的问题?
sys_count_digit(void)
{
int digit;
if (argint(0, &digit) < 0)
return -1;
return count_digit(digit);
}