Как вернуть структуру в системных вызовах xv6? - PullRequest
0 голосов
/ 08 мая 2020

В настоящее время я тестирую xv6 и реализовал новый системный вызов.

Насколько я понимаю, все системные вызовы в xv6 возвращают int. Это нужно и зачем?

Потому что я хотел бы вернуть C структуру.

Возможно ли это? Что мне нужно сделать, чтобы этого добиться?

1 Ответ

1 голос
/ 08 мая 2020

Значение, возвращаемое из системных вызовов, сохраняется в регистре eax.

Как видно из источника :

proc->tf->eax = syscalls[num]();

Это означает, что возвращаемый value всегда будет одним 32-битным значением.

Тип функций для обработчиков системных вызовов также определяется как возвращающие int и не принимающие аргументов:

static int (*syscalls[])(void)

Правильный способ вернуть структуру в этой ситуации - передать указатель пользовательского пространства в качестве аргумента системного вызова. Убедившись, что он действителен, он сохранит данные структуры по этому указателю. Обратите внимание, что, поскольку сам обработчик системных вызовов не принимает аргументов, вы должны использовать методы получения аргументов, такие как argptr, которые обрабатывают проверку действительности для вас.

...