Operating system 将用户给定的参数保存在xv6中的寄存器中

Operating system 将用户给定的参数保存在xv6中的寄存器中,operating-system,xv6,Operating System,Xv6,我们应该向xv6操作系统添加一个系统调用,该调用计算给定数字的位数。 为此,我们应该将数字保存在寄存器中,然后生成一个函数,从寄存器中读取该参数,并将其传递给处理系统调用逻辑的函数。 我的问题是:我们应该如何将用户给出的参数保存在寄存器中?在xv6中有一些通用寄存器,可以用于在用户程序中读取和写入。c中没有将int值写入寄存器的函数,但可以使用内联汇编c来实现。 例如,如果您的变量是a,并且希望将其保存在eax寄存器中,则可以使用以下代码: asm ("movl %0, %%eax;"

我们应该向xv6操作系统添加一个系统调用,该调用计算给定数字的位数。 为此,我们应该将数字保存在寄存器中,然后生成一个函数,从寄存器中读取该参数,并将其传递给处理系统调用逻辑的函数。
我的问题是:我们应该如何将用户给出的参数保存在寄存器中?

在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);   
    }