Как получить указатель на адресное пространство пользовательской памяти в Os/161 в execv

Я сейчас пишу execv(char *program, char **args) позвоните в Os / 161.

Итак, я получаю копию данных пользователя, предоставленных в программе и в args в пространстве ядра. Затем я создаю новое адресное пространство, в которое загружается программа с аргументами.

Вопрос в том, как найти соответствующий указатель на виртуальную память пространства пользователя, чтобы скопировать данные из пространства ядра в пространство пользователя перед переключением в пространство пользователя?

2 ответа

Я тоже работаю на OS161. Вот как я это делаю.

Прежде чем уничтожить текущее адресное пространство, скопируйте все аргументы в буфер ядра. Затем, после создания и активации нового адресного пространства, получите указатель стека с помощью as_define_stack и скопируйте эти аргументы в стек. Вы должны упаковать их очень аккуратно, иначе ваш новый стек будет поврежден. Также, как сказал Джеймс, все указатели (начало каждой строки аргумента) должны быть выровнены по 4 байта, а также stackptr. После этого вам нужно соответствующим образом настроить stackptr, чтобы освободить место для этих аргументов.

Вот документация, предложенная Гарвардом, вы можете проверить детали на странице 9.

[РЕДАКТИРОВАТЬ]

Я написал блог о системном вызове os161 execv. Надеюсь, я прояснил этот вопрос.

[/РЕДАКТИРОВАТЬ]

Используйте стек, но убедитесь, что память выровнена

Другие вопросы по тегам