Аз така и не стигнах до MPU-тата, ама не мисля че това има значение.
Значи правилният начин за смяна на контексти е през така наречените ексепшъни. Биле те софтуерни (svc/swi) или хардуерни. На пръв поглед нещата стават през стека. Хардуерно се спасяват някои регистри в текущия стек (който и да е той). При влизането във вектора ти се сменя на привилигирован режим и т.н.
Линк регистъра ти обаче не е адрес за връщане, а специална стойност от рода на FFFF-нещо си. Всичко това го има описано на много места.
Това, което не е описано много добре е, че ядрото си има нещо като вътрешен стек и си пази текущото ниво и колко нива си влязал. Демек като стане ексепшън и докато той се обработва стане друг ексепшън или фолт то си ги брои. Като тръгнеш да излизаш трябва да излезеш по обратния път. Нормално то си е така, но ако софтурно решиш да подменяш нещо по стековете трябва да симулираш толкова излизания с LR=FFFFFxx, колкото пъти си влизал. Демек не може да го излъжеш с броя нивата на вложеност. Ако се пробваш ще получиш хард фолт.
Но може да го лъжеш къде да се върне. Подменяйки стека или съдържанието на стека може да си дошъл от едно място, а да се върнеш на друго. Стига да се върнеш на същото ниво от което си дошъл. Така се сменят контексти във всеки ОС.
Другото, което е важно е, че ядрото тръгва с ресет ексепшън. Демек мисли, че е в ексепшън и може да "излезеш" от него. Но в стековете в паметта няма нищо и ако се пробваш ще гръмне. Естествено трябва да си попълниш нещо валидно в стека, преди да излезеш. Както се опитах да обясня по-горе, ядрото си знае че "излизаш" и знае, че трябва да се върне в по-ниско ниво. При излизане приоритета може само да пада и трябва да пада, иначе както казах хард фолт. При влизане може да се качва, иначе пак само хард фолт.
С други думи в ресета си нагласяш MPU-то и каквото решиш, подготвяш си някакъв стек все едно уж че си дошъл отнякъде от тред мод. Слагаш в LR вълшебната стойност и просто си излизаш