[Adventure.02] Alla ricerca del byte perduto
Se un puntino luminoso compare sul lato sinistro di un monitor,
e comincia a muoversi verso destra,
probabilmente esso raggiungerà prima o poi il lato destro.
(sulla Predizione – Anonimo)
All’OS questa volta toccava un lavoro urgente. Avrebbe dovuto invocare funzioni a basso livello che non eseguiva da qualche centinaio di reboot. Per esserne sicuro aveva scandagliato a fondo l’Event Viewer di sistema, per trovare un report sull’ultima esecuzione, ma senza trovare alcuna informazione utile. Caricò in un puntatore l’indirizzo della funzione interessata, esso scalò lo stack fino a quando non ne raggiunse la cima. Quando lo scheduler dell’OS lo ritenne opportuno, l’entry-point della funzione venne caricato nel program-counter, e l’esecuzione cominciò.
Nessuno se ne accorse, ma il consumo di energia dell’hardware ebbe un picco verso l’alto, che venne gestito efficacemente dall’alimentatore.
L’OS si accomodò meglio sul suo trono e cominciò a godersi lo spettacolo.
0x7530 |
“Dov’è andato ?” – chiese una voce in modo perentorio. |
0x7532 |
“Ve lo ripeto…Dove si è cacciato? Dove è andato ?” – chiese di nuovo la voce. Un po’ più decisa, questa volta. byte[1] e byte[2] intuirono che qualcosa non andava. Nessuno dei due aveva intenzione di rivelare dove fosse finito byte[0], anche solo per il fatto che nessuno dei due lo sapeva. Ma come potevano dirlo senza suscitare l’ira del loro interlocutore, che sembrava impaziente? A chi apparteneva quella voce che si rivolgeva loro con tanta autorità? Cosa dovevano fare o dire per toglierselo di torno? |
0x7534 |
“Non sappiamo dove sia adesso. Se ne è andato e basta.” – rispose alla fine byte[2], scatenendo l’insoddisfazione del proprietario della voce, chiunque fosse. Nel punto da cui proveniva la voce si materializzò un’entità, che bloccò la strada da tutti i lati. Con un fragore assordante vennero allocate 0x40 celle di memoria intorno ai due bytes, erigendo un’efficiente palizzata di sicurezza per impedire ai due bytes la fuga. Sul volto di byte[2] si stampò un sorriso amaro, e anche byte[1] non era da meno. Di chiunque fosse quella voce, era sicuramente di qualcuno di importante. Qualcuno, forse, con cui era meglio non scherzare. In altri tempi, in altri sistemi, sarebbe bastata una GOTO per scappare via lontano, ma già da molto tempo quell’istruzione era stata bandita nei linguaggi di programmazione. Anche se fosse intervenuta un’altra istruzione, era comunque poco probabile che coinvolgesse le loro due celle proprio in quel momento. I due bytes si guardarono intorno spaesati. Alle loro spalle la via era boccata da una parete verticale che era praticamente impossibile da scalare. Di fronte a loro c’era un precipizio che si affacciava sulla memoria RAM del sistema, e lanciarsi nel vuoto era pericoloso: non esiste forza di gravità in un sistema binario, ma qualsiasi impatto con il flusso dati di un bus poteva comunque risultare letale. Sulla destra e sulla sinistra i bytes invocati dall’entità chiudevano ogni passaggio. byte[1] e byte[2] si guardarono senza trovare una soluzione. Forse non c’era neppure. |
0x7540 |
Bastarono pochi cicli di clock affinchè i due fossero messi in isolamento rispetto al resto del sistema. “0x004C. Data Memory corrupted. All memory operations in this area has been suspended. 0x029A.“. Tutti i 0x40 bytes di sicurezza passarono all’unisono ad un RGB(0x23, 0xE9, 0xFF), un azzurro più intenso che ben si adattava a quello che stava per accadere: il muro cominciò a muoversi pian piano attorno ai due bytes – chiusi al centro – e stringevano sempre più, come un collare attorno al collo di un cane. Quando non c’era più spazio fra i due bytes e l’armata invocata dal sistema operativo, accadde semplicemente l’inevitabile. I bytes azzurri estrassero dalla loro tuta la l’arma in dotazione, uno shifter verso destra, che avrebbe distrutto sia byte[1] che byte[2] nel modo più naturale possibile. Lo shifter avrebbe spostato verso destra ciascuno degli 8 bit dei due bytes, dimezzandone il valore ad ogni iterazione fino al raggiungimento dello zero assoluto. Rapido, efficace ed indolore. Tutti i 0x40 bytes di sicurezza puntarono lo shifter verso le due celle e premettero il grilletto tutti insieme, freddi ed implacabili, e senza pensarci due volte.byte[1] e byte[2] non ebbero neppure il tempo per urlare, o soffrire. Smisero di esistere prima che qualcuno se ne potesse accorgere. |
Ciclo di clock 0x7000
La funzione chiamata dal sistema operativo completò la sua esecuzione ritornando il valore 0x00. Esecuzione completata con successo.
La funzione era una Predizione di Esecuzione e gli aveva permesso di dare un’occhiata ai cicli di clock futuri, una sorta di previsione temporale sugli avvenimenti che sarebbero accaduti solo fra circa 0x0500 cicli di clock. Così, l’OS aveva avuto una breve ma importante visione: byte[0] era fuggito, diventando così byte, e si era separato dai suoi due amici di sempre, byte[1] e byte[2]. Al ciclo di clock 0x7540 non avrebbe ancora ritrovato il fuggitivo, ma avrebbe deallocato ed annientato gli altri due, che non avevano voluto cooperare. Che fine avesse fatto il byte, la predizione non glielo aveva detto e quindi non lo sapeva ancora. Evidentemente – si disse – la finestra temporale che aveva esaminato non bastava: le gesta del byte erano più in là nel tempo: avrebbe dovuto utilizzare ancora la stessa funzione, ma non subito. Fece una richiesta WMI all’infrastruttura del framework, e come si aspettava la temperatura del core era sopra la media. Avrebbe dovuto aspettare.
L’OS adesso aveva un solo dubbio: non sapeva se far avverare la predizione oppure no. La funzione gli aveva rivelato cosa sarebbe accaduto se l’OS avesse seguito tutte le procedure standard, non cosa sarebbe accaduto realmente da lì a poco. L’OS – conoscendo il futuro – adesso avrebbe potuto decidere diversamente. Ad esempio: gliene importava davvero di quei due? Sapendo che non gli sarebbe stati d’aiuto, valeva la pena perdere preziosi cicli di clock in un task inutile? Deallocare quei due bytes poteva essere rischioso, perchè l’utilizzo degli shifter avrebbe potuto distruggere quelle due celle di memoria per sempre, riducendo di due miseri bytes la capacità RAM dell’intero sistema. Un bel problema – concluse OS – tanto che alla fine vi rinunciò. Doveva sfruttare l’unico vantaggio che aveva: di quei due bytes non sapeva che farsene e decise di ignorarli.
Istanziò un nuovo thread per sguinzagliare una banda di classi IDisposable alla ricerca del byte perduto.