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)
Jestem prawie pewna, że wczesna wersja Linuksa też była żartem. Nie bądź tak szybki, aby samemu się wycofać :-) – paxdiablo
Czy pytasz o konkretny problem ze stosu aplikacji, czy też pytasz o coś innego? – jxh
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. –