Может ли кто-нибудь объяснить об этой встроенной тестовой функции asm validateint() XV6, которая использует указатель в качестве ESP для системного вызова?

Привет~ Я работаю над 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. Я понятия не имею, что здесь произошло.


person MusicalChicken    schedule 16.03.2021    source источник
comment
Целочисленное переполнение?   -  person Mad Physicist    schedule 16.03.2021
comment
@MadPhysicist Это имеет смысл! так что же делать, если в ядре есть переполнение?   -  person MusicalChicken    schedule 16.03.2021
comment
Судя по комментарию, разве это не просто вызов SYS_sleep, предназначенный для демонстрации того, что ядро ​​будет (или не будет) ошибаться, если его аргумент (*p) является недопустимым указателем? Возвращаемые значения, похоже, подтверждают это (и то, что ядро ​​не ошибается), но я не понимаю, что означает, что res превращается в -1.   -  person Margaret Bloom    schedule 16.03.2021
comment
Какой смысл запрашивать p в 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


Ответы (1)


Из https://github.com/mit-pdos/xv6-public/blob/eeb7b415dbcb12cc362d0783e41c3d1f44066b17/syscall.c#L10 похоже, что аргументы системного вызова передаются в стек. Таким образом, цель этого кода, по-видимому, состоит в том, чтобы вызвать системный вызов с возможно недопустимым стеком, то есть с указателем стека, содержащим некоторый случайный адрес p.

Я предполагаю, что возвращаемое значение 0 соответствует тому, когда стек указывает на допустимую память процесса, а -1 возвращается, когда это не так.

person Nate Eldredge    schedule 17.03.2021