25/11/12 15:10
Lionel
Ciao a tutti,
Sto sviluppando un'istruzione in ASSEMBLY per la macchina Mic1.
La microistruzione che devo svolgere è la seguente:
Si microprogrammi per mic-1 un段struzione, da aggiungere al set di IJVM, che implementi un
meccanismo di lock da utilizzare nel contesto di un sistema multicore. L段struzione sia:
LOCK address
e serva per prendere il lock su una risorsa. Il meccanismo è questo: l段struzione prima controlla
se all段ndirizzo address è presente il valore 0. In caso contrario, attende che il valore all段ndirizzo
address torni a 0. Una volta rilevato che il valore ad address è tornato a 0, l段struzione prova a
scriverci il valore in cima allo stack. Quindi rilegge il dato ad address, per sicurezza, e verifica
che la scrittura sia andata a buon fine (per giustficare il perché la scrittura potrebbe non andare
a buon fine, si immagini un contesto multicore, in cui due processori potrebbero cercare di
scrivere contemporaneamente due valori diversi, e il sistema potrebbe risolvere la questione
scegliendone uno caso). Se il valore controllato non è quello scritto, l段struzione si rimette in
attesa del ritorno a 0 della cella, per poi riprovare a scrivere, etc. Altrimenti, il lock si considera
acquisito e l段struzione termina.
Ci ho ragionato un attimo e ho provato a buttare giù una prima idea che è la seguente:
lockAddress1 MAR = SP; rd
lockAddress2 OPC = TOS
lockAddress3 TOS = MDR
lockAddress4 Z = OPC; if (Z) goto L; else goto lockAddress1
L TOS = MDR; wr
L2 TOS = MDR AND TOS //Faccio l'AND per verificare che le due parole siano uguali
L3 if (Z) goto main1; else goto lockAddress1 //se la parola è uguale vado al main1 altrimenti torno a lockaddress1
Però non sono per nulla soddisfatto......c'è qualcuno che può darmi qualche dritta?
Sto sviluppando un'istruzione in ASSEMBLY per la macchina Mic1.
La microistruzione che devo svolgere è la seguente:
Si microprogrammi per mic-1 un段struzione, da aggiungere al set di IJVM, che implementi un
meccanismo di lock da utilizzare nel contesto di un sistema multicore. L段struzione sia:
LOCK address
e serva per prendere il lock su una risorsa. Il meccanismo è questo: l段struzione prima controlla
se all段ndirizzo address è presente il valore 0. In caso contrario, attende che il valore all段ndirizzo
address torni a 0. Una volta rilevato che il valore ad address è tornato a 0, l段struzione prova a
scriverci il valore in cima allo stack. Quindi rilegge il dato ad address, per sicurezza, e verifica
che la scrittura sia andata a buon fine (per giustficare il perché la scrittura potrebbe non andare
a buon fine, si immagini un contesto multicore, in cui due processori potrebbero cercare di
scrivere contemporaneamente due valori diversi, e il sistema potrebbe risolvere la questione
scegliendone uno caso). Se il valore controllato non è quello scritto, l段struzione si rimette in
attesa del ritorno a 0 della cella, per poi riprovare a scrivere, etc. Altrimenti, il lock si considera
acquisito e l段struzione termina.
Ci ho ragionato un attimo e ho provato a buttare giù una prima idea che è la seguente:
lockAddress1 MAR = SP; rd
lockAddress2 OPC = TOS
lockAddress3 TOS = MDR
lockAddress4 Z = OPC; if (Z) goto L; else goto lockAddress1
L TOS = MDR; wr
L2 TOS = MDR AND TOS //Faccio l'AND per verificare che le due parole siano uguali
L3 if (Z) goto main1; else goto lockAddress1 //se la parola è uguale vado al main1 altrimenti torno a lockaddress1
Però non sono per nulla soddisfatto......c'è qualcuno che può darmi qualche dritta?
aaa