|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Up.
__________________
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 |
|
|
|
|
|
#22 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
mi ci è voluto un pochino a mettermi nei panni del kernel, ragionavo sempre da sviluppatore di applicazioni
Difatti quando un processo faceva una send, mi domandavo come potesse scrivere nelle strutture dell'altro pocesso poi mi sono detto: alt! è il kernel che gioca con i due processi e allora tutto è diventato leggermente più chiaro: minix non è poi così brutto come lo si vuole dipingere |
|
|
|
|
|
#23 | ||
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Operazioni memoria memoria comportano un supporto da parte di entrambi gli operandi di tutte le possibili combinazioni di indirizzamento, ovvero tanti opcode da gestire. La cosa è evidenziata anche nell'articolo da te citato: Quote:
|
||
|
|
|
|
|
#24 | ||||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Se prendiamo il modello x86, che NON ha operazioni memoria-memoria (se escludiamo i casi particolari rappresentati dalle speciali istruzioni che lavorano su "stringhe", che però non hanno modalità d'indirizzamento, in quanto è codificato internamente), vediamo che l'organizzazione è decisamente più incasinata e il decoder si complica non poco stando dietro alla quasi casualità della mappatura degli opcode e, soprattutto, alla presenza di un numero variabile prefissi. 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 |
||||
|
|
|
|
|
#25 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
possiamo asserire che in definitiva minix tutto quello che fa è:
- gestire i processi in modo che a turno tutti usino la CPU - mettere a dormire i processi nel momento in cui questi faoono I/O - prendere i messaggi di un processo mittente e portali al processo destinatario che sia driver, server etc.... In definitiva scrive nei PCB dei processi e legge e scrive negli stack dei vari processi in quanto solo il kernel può farlo
|
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sostanzialmente sì.
__________________
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 |
|
|
|
|
|
#27 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
grazie cdmauro
parlando della fork() il cui scopo è quello di duplicare processi: Codice:
while (TRUE){
type.....prompt();
read...command(command, paramaters);
if(fork() != 0){
waitpid(-1, &status, 0);
} else {
execve(command, parameters, 0)
}
}
una volta incontrata la fork() questa ritorna un PID=0 e quindi viene eseguito il ramo dell'else che mandando in esecuzione la execve(...) fa iniziare una duplicazione completa in memoria del processo chiamante. In memoria ora si hanno due processi identici però: il processo "padre" ora ha PID != 0 e quindi rimane in attesa sulla waitpid(...) domande: - il processo figlio rimane con PID = 0 ? E quindi si comporta ora come se fosse un padre ? Come si potrebbe far generare al processo figlio un ulteriore processo figlio ? Spero di essere stato chiaro Ultima modifica di misterx : 23-06-2009 alle 08:09. |
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Più o meno. Immagino che PID sia una variabile locale che dovrebbe contenere il PID del processo figlio, ma non la vedo nel sorgente che hai postato.
__________________
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 |
|
|
|
|
|
#29 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
purtroppo ho solo quel frammento di codice. Cmq si, PID viene ritornato dalla fork()
Ultima modifica di misterx : 22-06-2009 alle 14:08. |
|
|
|
|
|
#30 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Allora posso soltanto aggiungere che ogni processo (padre, figlio / figli) ha un proprio PID (mai uguale a zero).
__________________
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 |
|
|
|
|
|
#31 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
però all'inizio e cioè quando esiste solo il processo padre hai PID = 0 e poi via via il padre diventa != 0 e il figlio varrà sempre zero, giusto ?
|
|
|
|
|
|
#32 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Allora ti riferisci necessariamente alla variabile che conterrà il PID.
Quindi il codice sarà qualcosa del tipo: Codice:
PID = fork();
if(PID != 0){
waitpid(-1, &status, 0);
}
else {
execve(command, parameters, 0)
}
__________________
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 |
|
|
|
|
|
#33 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
grazie
ho preso del codice postato da un utente e dopo compilazione l'ho lanciato più volte Codice:
#include <stdio.h>
#include <sys/types.h>
void main()
{
pid_t pid;
printf (“Prima della fork: PID = %d\n”, getpid());
pid = fork();
if (pid==0) /* PROCESSO FIGLIO*/
{
printf (“FIGLIO: PID = %d\n”, getpid());
exit(0);
}
else /* PROCESSO PADRE */
{
printf (“PADRE: PID = %d\n”, getpid());
printf (“PADRE: PID DEL FIGLIO = %d\n”, pid);
exit(0);
}
}
Quel 92 mi fa capire che il programma che io ho chiamato test è figlio di sh e quindi quando la shell manda in esecuzione test duplica se stessa. Lanciando test più volte si nota il seguente output: primo caso Prima della fork: PID = 219 FIGLIO: PID = 220 PADRE: PID = 219 PADRE: PID DEL FIGLIO = 220 secondo caso Prima della fork: PID = 227 PADRE: PID = 227 PADRE: PID DEL FIGLIO = 228 FIGLIO: PID = 228 sembrerebbe che si ha una duplicazione della shell e che quindi test diviene una copia della shell ma a sua volta una volta in esecuzione test, questo viene duplicato immediatamente nel primo caso e successivamente nel secondo caso: è dovuto allo scheduler questo effetto ? |
|
|
|
|
|
#34 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Sì, è corretto.
__________________
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 |
|
|
|
|
|
#35 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
una domanda di assembly
Codice:
L1: .data 4 0 ! dichiara la variabile L1 di 4 byte inizializzata a zero move al, (L1) ! copia il contenuto di L1 nel registro al della CPU mov (L1), ah ! copia l'indirizzo contenuto nel registro ah nella variabile L1 ??? mov eax, L1 ! copia in eax l'indirizzo in memoria occupato da L1 ????? grazie Ultima modifica di misterx : 15-07-2009 alle 15:54. |
|
|
|
|
|
#36 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
L1 è un "nome" a cui l'assembler (o il linker? non ricordo) sostituisce un numero, che è un indirizzo di memoria. Supponiamo che ad L1 sia associato il numero 0xABC Se tu provi a sostituire Codice:
0xABC: .data 4 0 ! riserva 4 byte a partire dall'indirizzo 0xABC move al, (0xABC) ! copia il contenuto della cella di indirizzo 0xABC in AL mov (0xABC), ah ! scrive nella cella d'indirizzo 0xABC il contenuto di AH mov eax, 0xABC ! copia in EAX 0xABC Le parentesi tonde in assembly funzionano come l'asterisco in C. Forse l'ultima riga può essere poco intuitiva. Pensa subito a cos'è L1. Un nome. Il nome viene trasformato nella fase di assembling (si dice così?) in un numero (che è un indirizzo di memoria), ben definito. Quindi potendo andare a guardare il codice assemblato tu vedrai l'ultima istruzione proprio come "scrivi in EAX 0xABC", una costante numerica, che è l'indirizzo di memoria che l'assembler durante il suo lavoro ha deciso di associare ad L1. Il discorso gira un po', spero di averti aiutato
__________________
|
|
|
|
|
|
|
#37 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3739
|
Quote:
scritto così: mov al, (L1) mi è chiaro in quanto come tu mi dici è come se scrivessi al = *L1 tipo, se L1 è all'indirizzo di memoria 100 e tale indirizzo contiene 20, dopo la mov al, (L1) il registro al conterrà 20 scritto così però: mov (L1), ah mi dice molto meno però dovrebbe essere ancora: *L1 = qualcosa ma questo qualcosa potrebbe essere di fatto o un indirizzo o un valore ? esempio: mov (L1), ah se ah contiene 28, a questo punto l'istruzione qui sopra assegna all'indirizzo di memoria 100 relativo a L1 28 ? E se scrivessi invece: mov L1, ah cambierebbe l'indirizzo di L1 da 100 a 28 ? scusa ma ho un pò di confusione grazie Ultima modifica di misterx : 15-07-2009 alle 19:22. |
|
|
|
|
|
|
#38 | ||||
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Quote:
Ti correggo pignolamente perché sbagliare anche una preposizione potrebbe portare confusione... Quote:
Attenzione però che essenzialmente non c'è differenza tra le parentesi tonde in assembly e l'asterisco in C, solo che qui stiamo parlando di due casi diversi. Infatti: Codice:
mov ah, (bx) Quote:
Codice:
*(100) = ventotto In realtà in C non vedrai mai quest'istruzione, perché non puoi decidere a tempo di compilazione un indirizzo specifico a cui vuoi accedere (se non in casi estremi; di solito non puoi perché il sistema operativo non ti permette di accedere a celle di memoria che non ti "appartengono", come processo in esecuzione). Le variabili globali in un programma C sono associate ciascuna ad un'etichetta come L1. Infatti, durante il processo di compilazione, esse sono tradotte in indirizzi! Quote:
Codice:
100 = ventotto E' anche traducibile in (utile se hai un minimo di esperienza nei puntatori, e penso che tu ce l'abbia) Codice:
&L1 = ventotto Se non ti è totalmente chiara una qualsiasi cosa chiedi assolutamente!
__________________
|
||||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:22.




















