Il kernel Linux 5.6 è stato rilasciato pochi giorni fa da Linus Torvalds e, nel frattempo, la FSFLA ha rilasciato Linux-libre 5.6, il fork completamente free approvato dalla Free Software Foundation, distribuito con a bordo solo codice libero ed open source. Vi ho raccontato delle numerose novità introdotte da questa nuova versione del kernel, su tutte l’integrazione della VPN WireGuard v1.0.0 e di una prima implementazione del supporto per l’USB4. Mi è sfuggita però una novità molto interessante, la risoluzione dell’annoso “bug dell’anno 2038“. Questa è la prima versione del kernel che permetterà ai sistemi a 32-bit di funzionare correttamente anche dopo il 19 gennaio del 2038.
Il bug dell’anno 2038
Per chi non lo sapesse il bug dell’anno 2038 è un problema che riguarda programmi che usano la rappresentazione POSIX per calcolare il tempo. La data del sistema è calcolata come il numero di secondi trascorsi dallo Unix Epoch Time 1º gennaio 1970. Questo tipo di sistema è lo standard per i sistemi Unix, e colpisce anche software per altri sistemi operativi che siano stati sviluppati in C. Sulla maggior parte dei sistemi a 32 bit, il valore del dato time.h
usato per questo calcolo è un numero intero a 32 bit di tipo signed.
Tra 18 anni non saranno molti i sistemi a 32 bit ancora attivi. Potrebbero però esserci dispositivi che svolgono compiti dedicati – magari device embedded – che per adempiere alle loro funzioni useranno una futura versione di Linux.Di qui l’importanza di gestire il bug
L’istante più lontano rappresentabile scoccherà alle ore 03:14:07 del 19 gennaio 2038 (UTC) momento in cui i dispositivi raggiungeranno il valore 231 (231-1 = 2,147,483,647 secondi dopo il 1° gennaio 1970). Dopo questo momento, il contatore supererebbe il valore massimo, e verrebbe considerato come un numero negativo. I computer leggeranno la data non come 2038, ma come 1901 (precisamente, le 20:45:52 UTC di venerdì 13 dicembre 1901), causando errori di calcolo.
Il problema è stato risolto nel kernel Linux 5.6 grazie alle modifiche apportate da Bergmann con una serie di patch dedicate a questo scopo. Le patch prevedono la rimozione dei tipi time_t/timeval/timespec e di alcune funzioni. Il time_t sarà a 64 bit ed è richiesto l’uso di Musl libc 1.2 e GNU C Library 2.32 (o superiori).
Seguiteci sul nostro canale Telegram, sulla nostra pagina Facebook e su Google News. Nel campo qui sotto è possibile commentare e creare spunti di discussione inerenti le tematiche trattate sul blog.