C 有人能解释一下使用指针作为系统调用ESP的XV6内联asm validateint()测试函数吗?
嗨~我正在开发xv6,我被困在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
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一样?)