Technology Experience
VivendoByte.ByteAdventure

[Adventure.02] Alla ricerca del byte perduto

Puntata precedente

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.
La risposta non arrivò subito, perchè i due furono presi alla sprovvista.
byte[1] e byte[2] si girarono quasi contemporaneamente verso la direzione dalla quale avevano sentito provenire la voce. Non c’era nessuno.

0x7532

Ve lo ripeto…Dove si è cacciato? Dove è andato ?” – chiese di nuovo la voce. Un po’ più decisa, questa volta.
Chi ?” – fece byte[1] intimidito.
Il byte che era allocato qui fino ad un attimo fa.“. La voce era sempre più irritata.

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.“.
La voce assunse un tono più metallico.
Non ci siamo capiti. VOGLIO e DEVO sapere dov’è finito! Non posso permettere che un byte se ne vada in giro per il MIO sistema!

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.

Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.