2014-09-12 15 views
5

Piszę monolityczny system operacyjny (żart to nazywanie go systemem operacyjnym, ale ma bardzo minimalistyczną funkcjonalność na poziomie szkoły). Kiedy mówię monolityczny, miałem na myśli, jest skompilowany jako pojedynczy binarny blob i bez wsparcia dla systemu plików itp. Obecnie mam po prostu elementarną prostą przestrzeń użytkownika, która jest niczym nieskończonym pętlą.Wyjście z aplikacji w systemie operacyjnym bez separacji pamięci

Mam zamiar uczynić mój system operacyjny trochę bardziej użytecznym i chcę móc pisać aplikacje użytkownika, które mogą zakończyć się jak zwykłe aplikacje na pełnym systemie operacyjnym.

Nie mam glibc lub odpowiednika. Moja aktualna biblioteka w przestrzeni użytkownika to kod, który napisałem. Teraz mój problem polega na dodawaniu ram dla aplikacji przestrzeni użytkownika, które umożliwiłyby zakończenie ich w punkcie stałym.

Wiem, jak programy są kompilowane na zwykłych systemach i co się dzieje, gdy program się kończy. Jednak w moim przypadku nie mam luksusu do kompilowania programów przeciwko bibliotekom, a jeśli program się kończy, wtedy mój wskaźnik instrukcji po prostu idzie na dziką wycieczkę.

Obecnie wszystkie aplikacje robię, aby wykonać "połączenie zwrotne" i wstępnie wypełniam stos aplikacji poprawionym adresem (podczas uruchamiania). Czy istnieje lepszy sposób na rozwiązanie tego problemu?

Wraz z odpowiedzią, byłbym bardziej niż szczęśliwy, aby uzyskać jasność niektórych koncepcji systemu operacyjnego.

Pracuję na platformie emulator x86 i statycznie kompiluję mój plik binarny. (Posiadam obsługę pamięci wirtualnej)

+3

Jestem prawie pewna, że ​​wczesna wersja Linuksa też była żartem. Nie bądź tak szybki, aby samemu się wycofać :-) – paxdiablo

+0

Czy pytasz o konkretny problem ze stosu aplikacji, czy też pytasz o coś innego? – jxh

+0

Pytam o rozwiązania dotyczące zakończenia aplikacji w stałym adresie. Obecnie wybrałem trasę, w której każda aplikacja ma ustalony adres zwrotny, który zapełniam na stosie. Teraz szukam lepszego rozwiązania. –

Odpowiedz

3

Ręczne tworzenie ramki pierwszego stosu z powrotem do kodu, który należy uruchomić, wydaje się być całkowicie rozsądną metodą. Jeśli twój system operacyjny ma "system", to kod czyszczenia procesu przestrzeni użytkownika (może nazywać się exit()) prawdopodobnie kończy się wywołaniem do syscall _exit(). Nadal musisz zająć się przypadkiem, w którym program próbuje wykonać kod w '' la-la land '', ponieważ tak się może dziać (jednak robienie tego zanim system ochrony stron może być trudnym problemem).

+0

Tak, moje obecne rozwiązanie jest dokładnie takie, jak wspomniałeś. Moja każda aplikacja powraca do stałego adresu i wyląduje w rutynie, która jest odpowiednikiem wyjścia. Potem idę i wykonuję syscall i wykonuję niezbędną przestrzeń użytkownika i czyszczenie przestrzeni jądra dla tej aplikacji. Jednak nie mogę mieć aplikacji, która nie zwraca ("zadzwoń" w kraju x86). Próbuję to osiągnąć za pomocą jakiegoś hackery. –

+0

Możesz mieć aplikacje, które nie powracają praktycznie w każdym systemie operacyjnym: 'int main (void) {do {} while (1); } ' –

+0

Och, może być moje sformułowanie nie było w porządku. Nie mogę mieć aplikacji takiej jak ta void main (void) {int j = 2;}. Jak wyjść z tej aplikacji idzie w La La Land. Jednak int main (void) {int j = 2; return;} nie powoduje żadnego problemu, ponieważ ma instrukcję return, która przenosi mnie do procedury czyszczenia. –

Powiązane problemy