2012-07-22 9 views
6

Un po 'intro,differenza tra Prelazione e il contesto passare

Attualmente sto scrivendo un piccolo kernel RTOS (lettura molto piccolo), ben si suppone essere monolitica con la maggior parte roba nel kernel. Tuttavia non riesco a trovare molte informazioni su alcune cose elencate qui sotto, sarebbe molto utile e inoltre, non è in realtà una sorta di progetto universitario, ma qualcosa che sto facendo di mia spontanea volontà.

Una migliore alternativa a rispondere a tutte le domande sarebbe se si potesse riferirsi a me un RTOS (o anche un libro gratuito) liberamente disponibile per il braccio preferibilmente che implementano userspace e sono preemptible (ma non complessa come Linux). Linux ha alcune delle peggiori documentazioni che ho visto finora (ho provato a capire le cose dal codice linux ma ci sono solo un sacco di definizioni sparse in milioni di file e hook di funzioni con nomi strani e roba che vengono ribattezzate tutte le versioni ottenendo anche a volte spostato ...)

  1. Qual è la differenza tra "preemption" e "context switch"?

  2. Quali sono le differenze chiave tra un kernel preemptive e nonpreemptive? Che lavoro è richiesto a un programmatore per rendere il kernel preventivo?

  3. Come creare e utilizzare la modalità utente?

    I documenti ARM dicono che in modalità utente, qualsiasi istruzione che passa a una modalità privilegiata verrà trattata come istruzione non definita.

  4. In tal caso, l'unico modo per un programma dello spazio utente di utilizzare il codice del kernel è syscalls?

  5. In che modo un kernel risponde o interagisce con userspace, quindi?

  6. Significa che l'unico thread del kernel dopo l'avvio (in un sistema semplice) sarebbe il thread inattivo?

  7. Se la pagina in cui risiedono il codice del kernel e i dati non è mappata quando si passa a un processo utente, quindi su un syscall o su un interrupt, come viene eseguito il codice del kernel senza essere mappato nello spazio degli indirizzi virtuali?

  8. Un "kernel preempibile" significa solo che il kernel è stato progettato in modo tale che sarebbe sicuro avere un cambio di contesto durante l'esecuzione del codice del kernel? o richiede più lavoro da fare se c'è?

Oh e se tali domande multiple non sono consentite qui, mi dispiace, non ho potuto trovare nulla al riguardo.

+3

Dal [FAQ]:. "I vostri quesiti dovrebbero essere ragionevolmente scope Se si può immaginare un intero libro che risponde alla tua domanda, si sta chiedendo troppo. " Ci sono troppe domande qui e lo scopo è davvero ampio. Sembra che tu abbia bisogno di un buon libro sul design del sistema operativo in generale, e uno buono su ARM in particolare. – Mat

+0

Sì, un libro sarebbe una buona cosa come menzionato nella domanda. lo scopo stesso delle domande non è così ampio, si tratta di preemption o della relazione dell'utente del kernel. Comunque ho paura che siano troppi per un singolo post, mi dispiace per quello. Vedrò cosa una mod ti consiglia di scomporre o cambiare in qualcosa del tipo "hai bisogno di un buon libro di progettazione del sistema per braccio" .. – sgupta

+0

Le domande di raccomandazione del libro non funzionano qui. (Ci sono alcuni storici che rimangono, ma quelli nuovi non sono i benvenuti.) – Mat

risposta

11

Come ha scritto Mat, questo è probabilmente irragionevolmente ambito. Tuttavia, cercherò di dedicare altrettanta attenzione alla somma delle domande, come farei con una domanda a ragione, nella speranza che ciò possa aiutarti a iniziare le ricerche.

1 Qual è la differenza tra "preemption" e "context switch"?

La prelazione è l'atto di interrompere un processo senza il suo coinvolgimento. In questo contesto, ciò significa probabilmente che verrà attivato un interrupt del timer.La parola deriva da un concetto legale di preemption: l'atto o il diritto di rivendicare o acquistare prima o preferire ad altri. Per i propri scopi, ciò significa che quando si attiva l'interruzione del timer, la routine di servizio di interruzione (ISR) ha la precedenza sul codice precedentemente in esecuzione. Questo non ha necessariamente bisogno di coinvolgere un kernel; è possibile avere codice in esecuzione in qualsiasi ISR ​​che verrà eseguito in modo preventivo.

Un interruttore di contesto è ciò che accade quando il codice OS (in esecuzione preventiva) altera lo stato del processore (registri, modalità e stack) tra un processo o il contesto di un thread e un altro. Lo stato del processore può trovarsi a una determinata riga di codice in un thread. Avrà dati temporanei nei registri, un puntatore allo stack in una certa area di memoria e altre informazioni di stato. Un OS preemptive può memorizzare questo stato (sia nella memoria statica che nello stack dei processi) e caricare lo stato di un processo precedente. Questo è noto come un interruttore di contesto.

2 Quali sono le differenze chiave tra un kernel preemptive e nonpreemptive? Che lavoro è richiesto a un programmatore per rendere il kernel preventivo?

In un kernel preventiva, un interrupt può sparare in tra due istruzioni di montaggio (noti come 'punti di sequenza'). In un kernel non preemptive, il processo in esecuzione deve chiamare una funzione yield() per consentire l'esecuzione degli altri thread. I kernel preventivi sono più complessi, ma forniscono una migliore illusione della concorrenza. I kernel non preventivi possono essere eseguiti in modo molto semplice con setjmp.h, ma ogni thread deve chiamare regolarmente yield() o gli altri thread non verranno eseguiti.

Quando viene chiamata una funzione come yield(), lo stato del processore viene memorizzato automaticamente. Quando si desidera rendere il sistema operativo preventivo, è necessario memorizzare queste informazioni manualmente.

3 Come creare e utilizzare la modalità utente?

I documenti ARM dicono che in modalità utente, qualsiasi istruzione che passa a una modalità privilegiata verrà trattata come istruzione non definita.

Corretto. Tuttavia, dicono anche che qualsiasi interrupt verrà eseguito automaticamente in modalità privilegiata. Su un sistema ARM, è possibile utilizzare l'istruzione svc per generare un interrupt software. Il codice SVC (parte del tuo sistema operativo) sarà quindi in grado di funzionare in modalità privilegiata.

4 Se è così, l'unico modo per un programma dello spazio utente di utilizzare il codice del kernel è syscalls?

Corretto. Almeno, questo è l'unico modo sicuro o corretto.

5 In che modo un kernel risponde o interagisce con userspace, quindi?

Su ARM, l'istruzione SVC può ottenere un valore di 8 bit. Questo può essere usato per generare 256 syscalls come yield, abilitare gli interrupt, disabilitare gli interrupt o qualunque cosa sia necessaria. È anche possibile scegliere di creare una memoria condivisa o un meccanismo di interazione di trasmissione di messaggi, se necessario.

6 Ciò significa che l'unico thread del kernel dopo l'avvio (in un sistema semplice) sarebbe il thread inattivo?

Questo dipende interamente da come si progetta il proprio sistema. È probabilmente più semplice se si sceglie di avviare il proprio kernel solo dopo aver creato tutti i thread, in questo modo non è necessario preoccuparsi di allocare dinamicamente i thread. In alternativa, si può iniziare con il thread inattivo e aggiungere altri thread in seguito (attraverso una shell remota? Penso che ci si vuole almeno un thread utente che esegue costantemente ...)

7 Se la pagina in cui il codice del kernel e risiede i dati non è mappato quando si passa a un processo utente, quindi su un syscall o interrupt, come si esegue il codice del kernel senza essere mappato nello spazio degli indirizzi virtuali?

Proprio come codice in modalità kernel viene eseguito in modalità privilegiata, anche se il codice è stato precedentemente in esecuzione in modalità utente, così sarà kernel modalità di esecuzione di codice da stack pointer principale (MSP), anche se il codice processo è stato utilizzato un indirizzo diverso spazio.

8 Un "kernel preempibile" significa solo che il kernel è stato progettato in modo tale che sarebbe sicuro avere un cambio di contesto durante l'esecuzione del codice del kernel? o richiede più lavoro da fare se c'è?

Penso che ciò significhi che il kernel possa prevenire il codice utente, non che il kernel stesso possa essere preventivato. Sarebbe difficile e insolito che qualsiasi cosa interrompa il kernel. Ciò richiederebbe più lavoro, e sto faticando a capire perché lo vorresti.

+0

La preemption del kernel è molto importante (scommetterei soprattutto per i sistemi in tempo reale). http://www.linuxjournal.com/article/5600 – Mat

+0

risposta soddisfacente comunque ancora non capisco In 7, ho chiesto che se il codice del kernel non è mappato nello spazio virtuale, come fa il codice cpu fetch da lì? non dovrebbe causare l'interruzione dei dati? In 8, Dato che questo è un kernel monolitico, sto implementando "la maggior parte" del kernel in modo che mi imponga di rendere effettivamente il codice del kernel preminente, supponiamo che io ottenga un syscall acquisito tramite spinlock o che qualche thread del kernel lo chiami su una singola CPU , porterebbe a un deadlock ma se quel thread fosse stato preimpostato, sarebbe andato bene su qualsiasi sistema poiché il thread sarebbe stato espulso dopo aver usato tutti i suoi quantum. – sgupta

+0

@ user1075375 - 7 - No, non causerà l'interruzione dei dati perché la CPU è in esecuzione in modalità privilegiata. Almeno, è così che lo capisco - ammetto che la maggior parte del mio lavoro è stato fatto su sistemi senza MMU o memoria virtuale. Re 8 - Se hai più CPU, allora sì, sarebbe utile se il codice del kernel fosse pre-scomposto. Tuttavia, non è possibile ottenere uno spinlock per acquisire syscall dalla CPU corrente - quando il codice del kernel è in esecuzione, il codice utente non è in esecuzione. –

1

Piuttosto che rispondere a ciascuna delle vostre domande enumerati, farò del mio meglio per assistere la vostra richiesta (per fortuna) in grassetto:

Una migliore alternativa a rispondere a tutte le domande sarebbe se si potesse fare riferimento alla me liberamente disponibile RTOS (o anche un libro libero) per braccetto preferibilmente

di Micrium uC/OS-III è un kernel in tempo reale con priorità, che (ovviamente) supporta sia prelazione sincrona e asincrona. E, poiché la fortuna lo vorrebbe (e il motivo per cui sto rispondendo) è che c'è un libro libero disponibile, e anche il codice sorgente è disponibile.

Dirigetevi verso lo main page for uC/OS-III e sulla sinistra vedrete un collegamento per un video che parla della disponibilità del codice sorgente ("uC/OS-III Source è disponibile").

Per quanto riguarda i libri, vai allo projects page e scegli il libro che più si avvicina al tuo obiettivo. Il 90% del materiale è lo stesso; solo le cose specifiche della CPU (come il cambio di contesto, l'inizializzazione di &) variano da un libro all'altro.

Dovrai registrarti per scaricare il libro & il codice, mi sembra giusto.

Buona fortuna e buon divertimento. Grazie per aver messo in grassetto la tua ultima richiesta/obiettivo, questo ha reso tutto molto più semplice.

+0

Grazie, esamineremo anche quello. – sgupta

1

Ho avuto l'impressione che uC/OS-III non fosse libero, ma concesso in licenza.

Un ottimo RTOS gratuito, e molto ben spiegato, è il FreeRTOS (http: //www.freertos.org /)

Si dovrebbe dare un'occhiata lì

+0

uC/OS non è libero di * licenza * in prodotti commerciali e non lo è mai stato.Il prezzo (da quello che ho sentito) per i vari prodotti/linea di prodotti/cpu/site [licenze] (http://micrium.com/page/products/licensing_pricing) varia da $ 10 a $ 20k. Tuttavia, è sempre stato disponibile alla fonte e il libro è fantastico (sì, penso che sia meglio documentato di FreeRTOS); Jean Labrosse è grande per l'educazione e l'apertura. –

+0

Ho inviato una modifica aggiungendo queste informazioni al post. –

+0

La modifica suggerita è stata rifiutata: http://stackoverflow.com/suggested-edits/327885 –