Как получить указатель на адресное пространство пользовательской памяти в Os/161 в execv
Я сейчас пишу execv(char *program, char **args)
позвоните в Os / 161.
Итак, я получаю копию данных пользователя, предоставленных в программе и в args в пространстве ядра. Затем я создаю новое адресное пространство, в которое загружается программа с аргументами.
Вопрос в том, как найти соответствующий указатель на виртуальную память пространства пользователя, чтобы скопировать данные из пространства ядра в пространство пользователя перед переключением в пространство пользователя?
2 ответа
Я тоже работаю на OS161. Вот как я это делаю.
Прежде чем уничтожить текущее адресное пространство, скопируйте все аргументы в буфер ядра. Затем, после создания и активации нового адресного пространства, получите указатель стека с помощью as_define_stack и скопируйте эти аргументы в стек. Вы должны упаковать их очень аккуратно, иначе ваш новый стек будет поврежден. Также, как сказал Джеймс, все указатели (начало каждой строки аргумента) должны быть выровнены по 4 байта, а также stackptr. После этого вам нужно соответствующим образом настроить stackptr, чтобы освободить место для этих аргументов.
Вот документация, предложенная Гарвардом, вы можете проверить детали на странице 9.
[РЕДАКТИРОВАТЬ]
Я написал блог о системном вызове os161 execv. Надеюсь, я прояснил этот вопрос.
[/РЕДАКТИРОВАТЬ]