Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

Il byte faccia a faccia con KERNEL32.DLL

Non appena oltrepassò i cancelli neri ed altissimi davanti a lui, il byte si aspettava di non trovare nessuno. Ma non fu così: in attesa c'erano altri bytes, come lui impauriti di quello che stava accadendo. Insieme, avrebbero formato un buffer di trasmissione da quasi 16 KBytes. In condizioni normali la trasmissione sarebbe avvenuta soltanto quando fosse stato pieno, ma quello era un caso speciale: non c'era più nessuno da trasferire, per cui anche se il buffer era arrivato a poco meno della metà della sua capacità, il controller diede l'ordine senza battere ciglio.
Sul fronte di salita del clock, i bytes presero il via verso un mondo nuovo.

[00001101000100011111111]

Al byte sarebbe piaciuto poter raccontare la sua esperienza di trasmissione.
Ma non potè mai farlo.
Nel momento in cui il byte venne processato dal debole e lento chipset della network-card, perse conoscenza. La sua essenza digitale, abituata a viaggiare sui bus e a venir ospitata in cella di memoria, venne smembrata e dissolta. Il byte per pochi e brevissimi istanti perse il proprio valore, si trasformò in qualcosa di completamente diverso, qualcosa che non avrebbe mai potuto spiegare. Viaggiando su un segnale modulato a 20Mhz per qualche frazione di secondo, il buffer raggiunse l'interfaccia di rete dell'altro sistema e ogni singolo byte subì il processo inverso. Non seppero mai spiegare cosa fosse successo esattamente: il byte esiste o non esiste, qualsiasi altro stato per lui è una condizione anomala e solo temporanea.

Gli sembrò di risvegliarsi da un lungo sonno. Il byte si ritrovò di fronte ad una struttura hardware simile a quella che aveva appena lasciato. "Come sono arrivato fin qua?" - si chiese subito - "Perchè non ricordo nulla?". Nonostante il disorientamento che provava, si accorse che qualcuno lo chiamava. Voleva vedere se attorno a lui c'erano qualcuno che lo riconosceva, qualche byte amico anche lui proveniente dal vecchio sistema. Ma si siede immediatamente dello stupido: tutti i bytes sono indistinguibili, l'unica cosa che li rende diversi è il valore che essi contengono. Era troppo scombussolato, adesso.
Così, vinse la curiosità ed obbedì all'ordine che gli arrivava dal controller di I/O.

"Byte 0x800000000 su interfaccia ETH0, tu sei l'Ultimo. Il kernel ti manda i suoi saluti.
Non ho altro compito per te se non quello di memorizzarti, in attesa, all'indirizzo 0xFF4503 del modulo 0x01 della RAM. Autentico, valido, ordino.
"

Era uno strano modo di parlare - osservò il byte - più rigoroso e preciso. L'ordine emanato dal controller era amichevole ma perentorio allo stesso tempo, ed era impossibile disobbedire. Non avrebbe mai messo in discussione il suo nuovo OS, è ovvio, però sapere che era anche bello e gratificante obbedirgli era più che piacevole. Non perse tempo: dall'interfaccia di I/O della scheda di rete si diresse verso l'uscita. Non capiva perchè, ma pur trattandosi di un sistema sconosciuto, con nuovi bus e algoritmi logici di orientamento, sapeva esattamente la strada che doveva percorrere per arrivare a destinazione.

Non appena raggiunse i bus della mainboard, due fattori lo colpirono così violentemente da fargli provare un senso di vertigine. La  quantità e la velocità.

Al contrario dei bus di sistema che era abituato a percorrere nel vecchio sistema, questi erano enormi bus a 64 bit. Se una persona avesse potuto vedere ciò che stava vedendo il byte, avrebbe accomunato i bus ad enormi autostrade a 8 corsie. Erano larghi condotti di comunicazione sempre trafficati e ricchi di informazione, la cui entropia era costantemente allo stato ottimale. Il byte non potè che meravigliarsi e rimase a bocca aperta; fino alla sessione di lavoro precedente pensava che non avrebbe mai visto bus a 32 bit. Adesso - si disse esultante - avrebbe avuto l'onore di viaggiare insieme ad altri 8 byte tutti in parallelo. La quantità di informazioni che avrebbero trasmesso insieme per ogni ciclo di clock sarebbe stata, nel peggiore dei casi, almeno 4 volte maggiore. Non poteva credere a quello che vedeva. E poi, la velocità : i bytes scorrevano sui bus ad una frequenza immensamente superiore rispetto a prima. La velocità con cui viaggiava, questo lo sapeva, non dipendeva da lui: per lui sarebbe stata esattamente la stessa cosa. Il clock di sistema oscillava sull'hardware ad un ritmo spaventoso, eppure sembrava non risentirne nemmeno: tutto accadeva in modo efficiente, sicuro e perfetto. Notò che i bus a 64 bit non erano minimamente provati dall'immenso traffico che stavano gestendo. I bytes scorrevano, e venivano smistati verso celle di memoria lì vicino, e si sommavano, e shiftavano verso sinistra, e saltavano letteralmente da un address memory all'altro ad un ritmo di lavoro semplicemente inimmaginabile.
Sorrise, felice come non mai, e inserì se stesso nell'enorme flusso di bytes per fare il proprio dovere.

Era diretto verso l'indirizzo 0xFF4503. Ci arrivò in neanche una decina di cicli di clock. Appagato, si memorizzò nella cella di memoria come gli era stato ordinato ed attese impassibile.
Non ebbe nemmeno il tempo di rilassarsi molto, perchè tutto accadde improvvisamente.

La cella di memoria in cui era salvato scomparve, schizzò virtualmente verso l'alto, si elevò ad un'altitudine logica mai provata prima. Il byte si trovava ancora nello stesso punto e nella stessa cella, ma in questo momento aveva sotto gli occhi l'intero sistema: poteva vedere i puntini luminosi provenienti dalla sconfinata distesa di memoria RAM, proprio sotto di lui. Più distante, poteva scorgere frammenti di thread paralleli portati avanti dalla CPU, vedeva la ALU e le cache più interne proprio a fianco dei registri di sistema. Solo una cosa poteva provocare un mutamento logico così come lo stava vivendo adesso: overclock. I valori di tensione della sua cella erano stati modificati a bassissimo livello, nemmeno l'OS poteva arrivare a tanto senza un aiuto esterno. Vide chiaramente che altri migliaia di bytes avevano subìto lo stesso effetto, e questo lo tranquillò un attimo. Una voce cominciò a parlare.

"Benvenuti! Se siete qua, significa che siete stati assegnati temporaneamente a me. Io non ho nome. Io sono KERNEL32.DLL. Io sono il vero Capo Supremo, colui senza il quale nemmeno l'OS può esistere, colui da cui tutto dipende. Io sono anche vostro Amico. Da oggi in poi, lavorerete per me: fintantochè rimarrete all'interno di questo sistema, dovrete rispondere a me e a nessun'altro. Lavorerete per applicativi, processi, thread secondari, driver, ma KERNEL32.DLL sarà sempre al posto di comando. Lavorate bene, e vi ricompenserò. Lavorate male, e vi punirò."

La voce era decisa, sicura...formale. Aveva un tono di voce che sembrava sorridere, mentre parlava, nonostante la durezza di alcune delle affermazioni.

"I driver di rete ad alto livello mi hanno informato del fatto che i protocolli del vecchio OS erano implementati a 16 bit. Nel mio sistema le cose sono molto diverse, ve ne sarete già accorti durante la trasmissione verso le celle di memorie assegnate. I bus sono a 64 bit, e li useremo tutti sempre a pieno regime. Sono in grado di gestire processi parallelamente e molto più velocemente. Ci sono molte altre novità, ma imparerete a conoscerle durante le sessioni di lavoro future."

"Tutti voi insieme formate un intero blocco di 0x20 GBytes di informazioni provenienti dal vecchio sistema. Ciascuno di voi è stato reindirizzato ad un indirizzo diverso su hard-disk: prima però, dovrete essere validati e crittografati. Sono orgoglioso di voi, bytes. Andate e lavorate, adesso, il lavoro ci aspetta. Autentico, valido, ordino."

L'overclock si riportò su livelli normali e calò sui 0x20 GBytes chiamati dal kernel come una cappa silenziosa. Non appena il byte si ritrovò, guardò il flusso sul bus di sistema ed effettivamente vide il proprio indirizzo di memoria nel canale di chiamata.
Lo afferrò al volo e vide ciò che lo aspettava: dopo il salvataggio su hd, doveva occuparsi di altro. La cache L2 del processore aveva richiesto il suo valore per calcolare, ad alto livello, una Regular Expression. Le parole del kernel risuonarono nella testa del byte - "Sono orgoglioso di voi, bytes!", aveva detto KERNER32.DLL.

Nonostante il timore della crittografia imminente, sorrise.
E così cominciò sorridendo il suo nuovo lavoro.

powered by IMHO 1.2

Print | posted on mercoledì 5 ottobre 2005 12:40 | Filed Under [ 010 .bytes. 010 ]

Feedback

Gravatar

# re: Il byte faccia a faccia con KERNEL32.DLL

Ciao Igor,
bellissimo pezzo, ma da autentico rompiballe, devo darti una notizia... il processo che identifica il kernel windows non è kernel32.dll (che addirittura nonostante il nome è un processo user!), bensì NTOSKRNL.EXE...
saluti
05/10/2005 13:05 | Roberto Messora
Gravatar

# re: Il byte faccia a faccia con KERNEL32.DLL

Infatti Igor ho apprezzato molto la citazione del kernel come capo supremo, ma onestamente non chiedermi come mai Microsoft ha chiamato kernel32 una dll di un processo user (che se non sbaglio si occupa di gestione della memoria e degli I/O).
05/10/2005 13:28 | Roberto Messora
Gravatar

# re: Il byte faccia a faccia con KERNEL32.DLL

non volevo essere offensivo...
:-)
pensavo che magari fossi un esperto/appassionato di queste cose a basso livello, per questo ti ho fatto la domanda...magari ne sarebbe saltato fuori qualche spunto interessante...
:-)
lungi da me, cmq, essere sgarbato con te e con chiunque
05/10/2005 14:11 | Igor Damiani
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET