Привет~ Я работаю над xv6 и застрял на проверке в usertests.c
. Есть ассемблерный код, и я совершенно не понимаю, что именно здесь происходит. Хочешь объяснить это мне?
// 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. Я понятия не имею, что здесь произошло.
SYS_sleep
, предназначенный для демонстрации того, что ядро будет (или не будет) ошибаться, если его аргумент (*p
) является недопустимым указателем? Возвращаемые значения, похоже, подтверждают это (и то, что ядро не ошибается), но я не понимаю, что означает, чтоres
превращается в -1. - person Margaret Bloom   schedule 16.03.2021p
в ECX с ограничением"c"
? Какие аргументы принимает системный вызов xv6 sleep? Linux следует POSIX и, например, имеетsleep(unsigned int seconds)
в качестве библиотечной функции поверх nanosleep. (И где xv6 хочет получить свои аргументы? В стеке пользовательского пространства, на который указывает ESP? Или EBX и ECX являются специальными, как для Linux int 0x80 ABI?) - person Peter Cordes   schedule 17.03.2021