2010-01-12 8 views
1

У меня есть простой загрузчик, который инициализирует и подготавливает SDRAM. Затем он загружает приложение из Flash и запускает его по некоторому адресу в ОЗУ. После того как приложение завершит свое выполнение, система перезапустится. Системного стека нет.C/Assembler - код возврата в однопользовательской однозадачной операционной системе без стека

Теперь я хотел бы, чтобы этот загрузчик получил контроль после того, как приложение завершило его выполнение. Загрузчик (давайте называть его OS) также должен прочитать код возврата приложения.

Как приложение может вернуть значение вызывающей операционной системе и как вызывающая ОС получает контроль? Я полагаю, это можно сделать с помощью прерываний - ОС имеет специальную резидентную функцию, соединенную с некоторым прерыванием, и каждое приложение просто вызывает это прерывание в конце своего собственного исполнения. Но как код возврата может быть прочитан ОС, если нет системного стека?

+1

Я не уверен, что это хорошее решение, но, возможно, вы можете просто сохранить возвращаемое значение в специальную ячейку памяти, используемую только для этой конкретной цели? Он должен хорошо работать, если ваша ОС позволяет одновременно запускать только одно приложение. –

ответ

4

Обычно вы оставляете код возврата в одном или нескольких регистрах, но поскольку вы находитесь под контролем, вы можете оставить его там, где хотите!

Когда приложение прерывается, процедура обработки прерывания должна где-то сохранять состояние приложения, что, вероятно, означает копирование из теневых регистров в предопределенное место в памяти.

Если приложение сдает управление обратно в ОС (через вызов программного прерывания/sytem), вам необходимо определить собственное соглашение о вызове, для которого вставляются аргументы регистров, и обработчик события должен следовать за этим, прежде чем передавать управление обратно в ОС. Вероятно, вы захотите, чтобы соглашение о вызове совпало с совпадением вашего компилятора c, чтобы все было легко для вас.

2

Одно из решений заключается в том, чтобы программа могла написать свой код выхода в фиксированном известном месте в памяти - тогда «ОС» может ее прочитать.

+1

Черт, мне было 27 секунд слишком медленно :( –