|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
[Linux] le syscall
sinceramente non sapevo dove postare una domanda del genere, in scienza e tecnica non mi sembrava troppo appropriata in quanto poi se si tira in ballo il codice dopo aver discusso a livello concettuale mi sembrava fuori luogo, spero di aver azzeccato il luogo.
Non conoscendo la filosofia di Linux ma sapendo che pure questo SO ha le sue syscall, mi chidevo come funzionano. Premetto che sto studiando minix e per quanto concerne le chiamate di sistema almeno l'approcio iniziale dovrebbe essere il medesimo. Il sistema minix consta di un certo numero di livelli partendo dal più basso abbiamo: il kernel il clock task ed il system task. Salendo i livelli troviamo i diver, i server ed infine i processi utente. Bene, dopo questa premessa mi chiedo: quando un programma a livello utente chiama un servizio tipico del kernel, chiede al livello inferiore un servizio e poi questo al suo livello inferiore sino ad arrivare al kernel ? Questo modo di comportarsi mi ricorda molto il modello ISO/OSI relativo alle reti. Ultima modifica di misterx : 19-05-2009 alle 21:19. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sì, il concetto è quello: si sale (o scende, a seconda dei punti di vista
![]() Nei sistemi dotati di microkernel e in cui vengono utilizzate primitive di comunicazione di tipo messagge passing o similiari, è possibile che ci siano dei buffer che "raccolgono" batch di richieste, in modo da spedirne un blocco al livello superiore e minimizzare, ove possibile, l'overhead dovuto a tale passaggio (esempio: passare da user-mode a kernel-mode è costoso per una CPU, per quanto possa essere agevolata da apposite API).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
ah grazie.
Stavo meditando ancora sui livelli ![]() Quindi ad esempio, se un processo utente chiama la fork() che risulta essere una system call senza parametri, questa viene rediretta tramite passaggi verso il kernel che duplicherà il processo chiamante(il padre). Mi viene da pensare che se il processo passasse direttamente la fork() così com'è direttamente al kernel, forse il kernel non avrebbe i riferimenti per capire chi deve duplicare allora, questa benedetta fork() scendendo i vari livelli, viene trasformata da opportune funzioni presenti in determinate librerie e che fungono da interfaccia verso il kerne, e la trasformazione consiste nell'aggiungere ulteriori informazioni per il kernel come credo ad esempio: il PID, il messaggio che rappresenta la fork() etc... Ma funziona così ? ![]() |
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Per la fork() penso che il PID sia l'unica informazione di cui ha bisogno per duplicare il processo, perché questo numero individua una struttura in kernel space in cui sono conservati tutti i dati necessari per capire quali risorse utilizza un processo e, quindi, in che modo poterle duplicare (se serve) per crearne un clone.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Grazie ancora.
Nel caso della fork() quindi, i vari livelli servono per tenere lontani i software di livello user dal PID ad esempio ? In questo modo, grazie ai livelli, nascondi la complessità ai livelli superiori almeno, questa è l'utilità pratica che ho colto io dei livelli. Con i livelli io sotto, a livello kernel, posso fare quello che voglio e il tuo programma, ma anche tutte le migliaia di programmi già scritti e compilati che ci sono in giro, richiamando semplicemente la fork() non devono essere necessariamente ricompilati e continueranno a funzionare. Al contrario, se chiamavi direttamente la sys_call come fa il kernel, magari dovendo specificare diversi parametri, se a livello kernel ne aggiungo o tolgo uno di detti parametri obbligherei tutti a ricompilare. Chissà se ho colto! |
![]() |
![]() |
![]() |
#6 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
A tal proposito alla recente PyCon3 c'è stato un talk di Alex Martelli sull'argomento che è stato illuminante. Ti consiglio di leggerlo perché ne vale veramente la pena (e, meglio ancora, guardarti il video quando sarà disponibile, fra qualche mese).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
domanda apparentemente banale
![]() Sto implementando una nuova syscall in minix e siccome è la prima volta che sbircio all'interno di un SO, il fatto che minix come del resto altri SO sia costruito a livelli significa che: - scrivo il programma A che necessita del programma sottostante B e che a sua volta necessita del livello sottostante C etc.... Così dicendo è quindi una scelta implementativa e cioè, nessuno mi vieta di by-passare tutti i livelli sottostanti e parlare direttamente col kernel sempre che si sappia dove mettere le mani. Perchè sto discorso ? Perchè solo passando dallo studio concettuale alla pratica ci si accorge che i livelli non sono altro che concetti nel senso che, nessuno mi vieta di implementare la mia funzione direttamente nel kernel e far parlare una applicazione di livello user direttamente co livello kernel, giusto ? Ovviamente così facendo manderei a ramengo tutta la filosofia sulla quale si erge l'idea minix! In definitiva le istruzioni che si possono trovare in giro circa l'implementazione di una nuova syscall in minix non sono altro che le volontà di Tanenbaum e cioè: se vuoi che minix continui a funzionare nel modo da me stabilito devi: - dichiarare nella directory xyz la tua nuova syscall - implementare la tal funzione nella directory abcd - ricompilare e richiamare la syscall Questo significa sposare la filosofia di un SO ? Scusate la lungaggine ma grazie infinite a chi mi leggerà |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sostanzialmente sì, e proprio per questo NON aggiungerei API al microkernel: proprio perché è "micro", sarebbe meglio aggiungerle negli strati software che girano in user mode.
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
grazie per la risposta
![]() Ti risulta che quando compili il kernel questo ha già indirizzi fissi in memoria dove piazzarci le varie tabelle per le varie gestioni degli interrupt ad esempio e le eccezioni ? |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
accumulo un'altra domanda
Codice:
push eax mov eax, 0+4(esp) mov (old_eip), eax mov eax, 4+4(esp) mov (old_cs), eax mov eax, 8+4(esp) mov (old_eflags), eax Cioè anzichè: Codice:
mov eax, 0+4(esp) mov (old_eip), eax Codice:
mov (old_eip), 0+4(esp) |
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
In generale è sempre meglio non fare assunzioni su dove mettere certe strutture, anche perché le architetture moderne permettono di rilocare praticamente qualunque dato. Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Significa che un 68000+ è in grado di eseguire una copia fra due locazioni di memoria con una sola istruzione MOVE, mentre un 386+ no, perché la sua MOV può avere soltanto un indirizzo di memoria per i suoi due operandi, e l'altro deve necessariamente essere un registro.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
|
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
E sono istruzioni che un'architettura RISC non supporterà mai? |
|
![]() |
![]() |
![]() |
#16 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
![]() Quote:
![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non essere così duro: potrebbe essere un legittimo dubbio. Non si nasce esperti di architetture degli elaboratori...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
La domanda era retorica.
x86 rimane pur sempre un'architettura CISC, che avrebbe anche consetito l'inserimento di tale (architetturalmente parlando) bestialità. In questo caso x86 batte il 68000 ma dopotutto uno è vivo e vegeto l'altro è morto. |
![]() |
![]() |
![]() |
#20 | |||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
E parlo da programmatore assembly 680x0 e 80x86 di lunga data. A questo punto, visto che non sei a digiuno sulle architetture degli elaboratori, una spiegazione del perché sarebbe una bestialità non sarebbe male. Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:54.