C/Assembler - Код за връщане в операционна система за един потребител и една задача без стек

Имам прост буутлоудър, който инициализира и подготвя SDRAM. След това зарежда приложение от Flash и го стартира на някакъв адрес в RAM. След като приложението приключи изпълнението си, системата се рестартира. Няма системен стек.

Сега бих искал този буутлоудър да получи контрол обратно, след като дадено приложение завърши изпълнението си. Буутлоудърът (да го наречем OS) също трябва да прочете кода за връщане на приложението.

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


person psihodelia    schedule 12.01.2010    source източник
comment
Не съм сигурен, че това е добро решение, но може би можете просто да запишете върнатата стойност в специално място в паметта, използвано само за тази конкретна цел? Трябва да работи добре, ако вашата операционна система позволява само едно приложение да работи едновременно.   -  person Thomas Bonini    schedule 12.01.2010


Отговори (2)


Обикновено бихте оставили код за връщане в един или повече регистри, но тъй като вие контролирате, можете да го оставите където пожелаете!

Когато дадено приложение бъде прекъснато, рутината за обработка на прекъсвания трябва да запише някъде състоянието на приложението, което вероятно ще означава копиране от скритите регистри в предварително дефинирано място в паметта.

Ако дадено приложение предаде контрола обратно на операционната система (чрез софтуерно прекъсване/системно извикване), тогава трябва да дефинирате своя собствена конвенция за извикване, в кои регистри се поставят аргументи, и манипулаторът на събития трябва да следва това, преди да прехвърли управлението обратно на операционната система . Вероятно искате да накарате конвенцията за извикване да съвпада с тази на вашия c компилатор колкото е възможно повече, за да улесните нещата за себе си.

person James    schedule 12.01.2010

Едно решение е програмата да напише своя изходен код на фиксирано, известно място в паметта - след това "ОС" може да го прочете.

person Community    schedule 12.01.2010
comment
По дяволите, забавих се с 27 секунди :( - person Thomas Bonini; 12.01.2010