2014-09-12 5 views
5

Sto scrivendo un sistema operativo monolitico (è uno scherzo chiamarlo un sistema operativo ma ha funzionalisti di livello scolastico molto minimi). Quando dico monolitico, intendevo, è compilato come un singolo blob binario e nessun supporto per il file system ecc. Attualmente ho solo uno spazio utente semplice e rudimentale che non è altro che un ciclo infinito.Uscita da un'applicazione in un sistema operativo senza separazione della memoria

Sto pianificando di rendere il mio sistema operativo più utile e di voler scrivere app utente che possono terminare come normali app su un sistema operativo completo.

Non ho glibc o equivalente. La mia attuale libreria nello spazio utente è il codice che ho scritto. Ora il mio problema è come aggiungere un framework per le app dello spazio utente, che permetterebbe loro di terminare in un punto fisso.

So come vengono compilati i programmi sui sistemi regolari e cosa succede quando un programma termina. Tuttavia, nel mio caso, non ho il lusso di compilare programmi contro le librerie e se un programma termina, il mio puntatore di istruzioni va in una deviazione selvaggia.

Attualmente sto facendo tutte le app per fare una "chiamata di ritorno" e sto pre-popolando lo stack delle app con un indirizzo di correzione (durante il lancio). C'è un modo migliore per gestire il problema?

Insieme alla risposta, sarei più che felice di ottenere chiarezza su alcuni concetti del sistema operativo.

Sto lavorando su piattaforma emulatore x86 e sto compilando staticamente il mio binario. (Ho un supporto per la memoria virtuale)

+3

Sono abbastanza sicuro che la prima versione di Linux fosse uno scherzo. Non essere così veloce da autoironico :-) – paxdiablo

+0

Stai chiedendo di un problema specifico con lo stack di app o stai chiedendo qualcos'altro? – jxh

+0

Sto chiedendo soluzioni sulla terminazione dell'app in un indirizzo fisso. Attualmente ho intrapreso un percorso in cui ogni app ha un indirizzo di ritorno fisso che popolino sullo stack. Ora, sto cercando una soluzione migliore. –

risposta

3

Creazione manuale del primo frame di stack con un ritorno in qualsiasi codice di cleanup del processo che è necessario eseguire sembra un metodo perfettamente ragionevole. Se il sistema operativo ha "syscalls", il codice di pulizia del processo nello spazio utente (forse chiamato exit()) probabilmente termina con una chiamata al syscall _exit(). Devi ancora gestire il caso in cui il programma tenta di eseguire codice in "la-la-land" perché ciò può ancora accadere (tuttavia farlo prima di avere un sistema di protezione della pagina potrebbe essere un problema difficile).

+0

Sì, la mia soluzione attuale è esattamente come quella che hai menzionato. Ogni mia app restituisce un indirizzo fisso e finisce in una routine che equivale all'uscita. Poi vado a fare una syscall e faccio lo spazio utente necessario e lo spazio del kernel per la pulizia di quell'app. Tuttavia, non posso avere un'app che non restituisca ("ret call" in x86 land). Sto cercando di raggiungere questo obiettivo con alcuni degli hackery. –

+0

Puoi avere app che non ritornano praticamente in tutti i sistemi operativi: 'int main (void) {do {} while (1); } ' –

+0

Oh, forse il mio testo non era giusto. Non posso avere un'app come questo void principale (void) {int j = 2;}. Come l'uscita di questa app va a La La Land. Comunque int main (void) {int j = 2; return;} non causa alcun problema in quanto ha un'istruzione return che mi porta a una routine di pulizia. –

Problemi correlati