как получить указатель на адресное пространство пользовательской памяти в Os / 161 в execv - PullRequest
0 голосов
/ 26 октября 2009

Я пишу execv(char *program, char **args) Звоните Os / 161 .

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

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

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

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

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

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

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

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

[/ EDIT]

2 голосов
/ 27 октября 2009

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

...