Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有人能解释一下使用指针作为系统调用ESP的XV6内联asm validateint()测试函数吗?_C_Assembly_X86_Inline Assembly_Xv6 - Fatal编程技术网

C 有人能解释一下使用指针作为系统调用ESP的XV6内联asm validateint()测试函数吗?

C 有人能解释一下使用指针作为系统调用ESP的XV6内联asm validateint()测试函数吗?,c,assembly,x86,inline-assembly,xv6,C,Assembly,X86,Inline Assembly,Xv6,嗨~我正在开发xv6,我被困在usertests.c中的验证测试中。有asm代码,我对这里到底发生了什么感到困惑。你能给我解释一下吗 // try to crash the kernel by passing in a badly placed integer void validateint(int *p) { int res; printf(stdout,"in validateint\n"); asm("mov %%esp, %%ebx\n\t&q

嗨~我正在开发xv6,我被困在
usertests.c
中的验证测试中。有asm代码,我对这里到底发生了什么感到困惑。你能给我解释一下吗

// try to crash the kernel by passing in a badly placed integer
void
validateint(int *p)
{
  int res;
  printf(stdout,"in validateint\n");
  asm("mov %%esp, %%ebx\n\t"
      "mov %3, %%esp\n\t"
      "int %2\n\t"
      "mov %%ebx, %%esp" :
      "=a" (res) :
      "a" (SYS_sleep), "n" (T_SYSCALL), "c" (p) :
      "ebx");
  printf(stdout,"%d \n",res);
}
我发现
res
随着
p
的增加而增加,但在某一点上
res
变成了0,然后变成了-1。只要
res
变为-1,整个函数就会停止。我不知道这里发生了什么。

从中可以看出,系统调用参数是在堆栈上传递的。因此,此代码的目的似乎是使用可能无效的堆栈调用系统调用,即使用包含一些随机地址的堆栈指针
p


我猜返回值0对应于堆栈指向有效进程内存的时间,而-1对应于堆栈未指向有效进程内存的时间。

Integer overflow?@madpysicator这很有意义!那么,如果内核中出现溢出,操作系统该怎么办呢?根据注释判断,这不只是对
SYS\u sleep
的调用吗?它的目的是证明如果内核的参数(
*p
)是无效指针,内核将(或不会)出错吗?返回值似乎证实了这一点(并且内核没有故障),但我不明白“只要
res
变成-1”是什么意思。在带有
约束的ECX中要求
p
有什么意义?xv6的“睡眠”系统调用采用什么参数?例如,Linux遵循POSIX,在nanosleep之上有
sleep(unsigned int seconds)
作为库函数。(xv6希望它的参数在哪里?在用户空间堆栈上,由ESP指向?或者EBX和ECX是特殊的,就像它们用于Linux int 0x80 ABI一样?)