Τις προάλλες άλλαζα την ημερομηνία στο ZTE Blade κινητό μου στα πλαίσια
ενός σοβαρού επιστημονικού πειράματος (βασικά, σαν ένα cheat για το
παιχνίδι Paradise Island 1.0.2 :P ).
Όταν έφτασα στο 2037, το σύστημα αρνούταν να δεχτεί το 2038.
Περίεργος στο γιατί συμβαίνει αυτό, ρύθμισα το κινητό στις 31/12/2037,
23:59. Ένα λεπτό αργότερα, ήμουν στην 1/1/2038 χωρίς πρόβλημα. Δεν
μπορούσα όμως να πάω στην 1/2. Ούτε όμως και στις 30/1.
Αντί, σαν σώφρων άνθρωπος, να εγκαταλείψω την προσπάθεια,
πειραματιζόμενος έφτασα μέχρι τις 19 Ιανουαρίου, και στη συνέχεια άρχισα
να πειραματίζομαι με την ώρα. Λίγα λεπτά μετά, το Blade μου κόλλησε
τόσο που χρειάστηκε να βγάλω τη μπαταρία για να κλείσει. Όταν την
ξανάβαλα και το ξανάνοιξα, δεν έμπαινε καθόλου στο λειτουργικό, μόνο
κόλλαγε σε ένα Infinite loop καθώς έδειχνε το σήμα του Android.
Διαβάζοντας στο internet, ανακάλυψα για το πρόβλημα του Unix με το
2038. Για την ακρίβεια, η επικίνδυνη ημερομηνία δεν είναι η 1/1/2038,
αλλά η 19η Ιανουαρίου 2038 και ώρα 3:14:07 UTC.
Μοιάζει λίγο τυχαίο για πρόβλημα που επηρεάζει σχεδόν όλα τα 32-bit
Unix-οειδή συστήματα, έτσι δεν είναι? Δηλαδή, τι το ξεχωριστό έχει η
συγκεκριμένη ημερομηνία και ώρα?
Η απάντηση είναι απλή. Πολλά λειτουργικά συστήματα
(συμπεριλαμβανομένου του Android τουλάχιστον μέχρι την έκδοση 2.2)
αποθηκεύουν την ημερομηνία και την ώρα σαν ένα προσημασμένο 32-bit
ακέραιο αριθμό στο δυαδικό σύστημα. Ο αριθμός αυτός εκφράζει το πόσα
δευτερόλεπτα έχουν περάσει από την Πέμπτη, 1η Ιανουαρίου του 1970, στις
0:00:00 μέχρι σήμερα.
Εφ' όσον λοιπόν η 1η Ιανουαρίου του '70 είναι η ημερομηνία "μηδέν",
εκφράζεται στο 32-bit δυαδικό σύστημα σαν 00000000 00000000 00000000
00000000.
Στις 3:14:07 της 19ης Ιανουαρίου 2038, έχουν περάσει 2.147.483.647
δευτερόλεπτα από την ημερομηνία του 1970. Ο αριθμός αυτός, στο δυαδικό
σύστημα εκφράζεται ως εξής:
01111111 11111111 11111111 11111111.
Ένα δευτερόλεπτο αργότερα, ο δυαδικός γίνεται
10000000 00000000 00000000 00000000
Όπως αναφέραμε, ο ακέραιος αυτός είναι προσημασμένος, και άρα το
πρώτο bit στο μετρητή είναι αυτό που δείχνει το πρόσημο (0 για θετικούς
αριθμούς, 1 για αρνητικούς). Εφ' όσον όλα τα προηγούμενα λειτουργικά
bits έχουν εξαντληθεί, το σύστημα αναγκαστικά αλλάζει το πρώτο bit.
Ουσιαστικά, δηλαδή, από το 2.147.483.647 πηγαίνει στο -2.147.483.647 και
συνεχίζει να μετράει, αντίστροφα πλέον, προς το μηδέν (-2.147.483.646,
...645, ...644 κλπ).
Δείτε σε αυτό το gif της Wikipedia το πρόβλημα στην πράξη:
Αυτό το πρόβλημα δεν επηρεάζει μόνο τα λειτουργικά συστήματα που
υπολογίζουν την ημερομηνία με αυτό τον τρόπο (Unix-οειδή ή μη), αλλά και
εφαρμογές που μπορεί να υπολογίζουν μελλοντικές ημερομηνίες. Στα
συστήματα αυτά, μάλιστα, το πρόβλημα θα εμφανιστεί νωρίτερα από το έτος
2038. Για παράδειγμα, αν ένα πρόγραμμα δουλεύει με ημερομηνίες 20 χρόνων
στο μέλλον, θα εμφανίσει πρόβλημα από το 2018.
Τα συστήματα που είναι πιο ευαίσθητα σε αυτό το πρόβλημα είναι
ενσωματωμένα συστήματα. Για παράδειγμα, στα αυτοκίνητα τέτοια συστήματα
κάνουν υπολογισμούς για λειτουργίες ο έλεγχος του ABS, του electronic
stability control (ESC/ESP), το traction control (TCS) και η αυτόματη
λειτουργία 4x4. Σε σύγχρονα αεροσκάφη, ενσωματωμένα συστήματα ρυθμίζουν
θέματα πλοήγησης ή του GPS. Και, φυσικά, όπως έμαθα με το δύσκολο τρόπο,
συσκευές τηλεπικοινωνίας, όπως κινητά και άλλες συσκευές δικτύωσης
είναι επίσης ευαίσθητα στο πρόβλημα.
Παρ' ότι οι υπολογιστές αργά αλλά σταθερά πηγαίνουν προς τα 64 bit,
τα περισσότερα ενσωματωμένα συστήματα συνεχίζουν και χρησιμοποιούν 8bit ή
16bit μικροεπεξεργαστές. Επίσης, σε αντίθεση με τους υπολογιστές, όπου
κάθε γενιά τεχνολογίας ορίζεται σε ένα διάστημα 18-24 μηνών, τα
ενσωματωμένα αυτά συστήματα έχουν σχεδιαστεί για να διαρκούν όσο το
σύστημα στο οποίο βρίσκονται ενσωματωμένα (αυτοκίνητο, αεροπλάνο κλπ).
Είναι λοιπόν αναμενόμενο αρκετά από αυτά να συνεχίσουν να βρίσκονται σε
λειτουργία μέχρι την επικίνδυνη ημερομηνία. Ταυτόχρονα, η αλλαγή του
software σε αυτά τα συστήματα είτε δεν είναι πρακτική, είτε είναι απλά
αδύνατη, πράγμα που σημαίνει πως θα πρέπει να αντικατασταθούν εξ'
ολοκλήρου.
Επιπλέον, το 2038 μπορεί να επηρεάσει δομές δεδομένων, όπως file
systems (όπως πολλά inode file systems που ακόμα χρησιμοποιούνται),
βάσεις δεδομένων με 32-bit time fields, βάσεις δεδομένων COBOL από το
'70, '80 και '90, υποσυστήματα εργοστασίων για ποιοτικούς ελέγχους και
διάφορες ιατρικές και στρατιωτικές συσκευές.
Αυτή τη στιγμή δεν υπάρχει μία καθολική λύση για το πρόβλημα του
2038. Κάθε αλλαγή στον ορισμό των time_t δεδομένων θα έφερνε
ασυμβατότητα στον κώδικα που βασίζεται στη μορφή του time_t ακεραίου για
τον υπολογισμό της ημερομηνίες. Αν, ας πουμε, αντί για προσημασμένος ο
32-bit ακέραιος γινόταν χωρίς πρόσημο (υπολογίζοντας και το πρώτο bit
στον αριθμό και επεκτείνοντας την ημερομηνία μέχρι το 2106), τότε θα
είχαν πρόβλημα προγράμματα που υπολογίζουν ημερομηνίες πριν το 1970,
καθώς αυτές οι ημερομηνίες υπολογίζονται με αρνητικούς αριθμούς.
Πάντως, τα λειτουργικά συστήματα που είναι σχεδιασμένα για να τρέχουν
σε 64-bit hardware ήδη χρησιμοποιούν 64-bit time_t ακεραίους, πράγμα
που σημαίνει πως θα εμφανίσουν πρόβλημα σε 292 δισεκατομμύρια χρόνια
(την Κυριακή 4 Δεκεμβρίου του 292.277.026.596, για την ακρίβεια).
Όσο για το κινητό μου? Μην έχοντας επιλογή να μπω σε κάποιου είδους
BIOS για να διορθώσω την ημερομηνία, δοκίμασα να φλασάρω ένα νέο ROM με
το Clockwork, πράγμα που δυστυχώς δεν λειτούργησε. Τελικά, μετά από
μερικές ώρες ανησυχίας πως το κινητό μου πλέον ήταν λιγότερο χρήσιμο κι
από τούβλο (και μάλλον έχοντας καταργήσει την εγγύηση με τα τόσα
φλασαρίσματα), κατάφερα να το επιδιορθώσω, εφαρμόζοντας ένα ROM με τη
μέθοδο Total Phone Transfer. Αν δεν είχα αυτή την επιλογή (όπως για
παράδειγμα, αν το κινητό μου ήταν iPhone) παίζει και να μην μπορούσα να
το επιδιορθώσω.
Ηθικό δίδαγμα? Αν το κινητό δεν θέλει να βάλει μια συγκεκριμένη
ημερομηνία, μην το πιέζετε, γιατί παίζει να σας κρατήσει μούτρα, ίσως
και για πάντα...