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’istruzione, da aggiungere al set di IJVM, che implementi un
meccanismo di lock da utilizzare nel contesto di un sistema multicore. L’istruzione sia:
LOCK address
e serva per prendere il lock su una risorsa. Il meccanismo è questo: l’istruzione prima controlla
se all’indirizzo address è presente il valore 0. In caso contrario, attende che il valore all’indirizzo
address torni a 0. Una volta rilevato che il valore ad address è tornato a 0, l’istruzione 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’istruzione si rimette in
attesa del ritorno a 0 della cella, per poi riprovare a scrivere, etc. Altrimenti, il lock si considera
acquisito e l’istruzione 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?
|