C / Assembler - код возврата в однопользовательской операционной системе с одним заданием без стека - PullRequest
1 голос
/ 12 января 2010

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

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

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

Ответы [ 2 ]

4 голосов
/ 12 января 2010

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

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

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

2 голосов
/ 12 января 2010

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

...