繼上個月的十二行代碼分分鐘讓浏覽器崩潰iPhone重啟事件之後,近日又有網友爆出:如果把64位的iOS設備(iPhone、iPad、iPod touch)系統時間修改為1970年1月1日,設備重啟後將變磚。
也有人稱:即便是進DFU模式都無法刷機重啟,只能到售後去解決問題。
今天抱著No Try No High Give Me Five的心態把自己的iPhone(型號:5S)系統時間設置成了1970年1月1日:
當時的我心想:只要把時間設置成23點五十多分,只需十來分鐘就能恢復正常,想想都覺得自己機智得不要不要的,然後安心地重啟了設備。
重啟之後,設備和大多數人的一樣:變磚了,一直卡在開機的Logo界面,而且設備還比平時更燙。
原以為只有等十幾分鐘,系統日期轉為1970年1月2日的時候就能恢復,可是蘋果白屏持續了二十分鐘,然後又關機放了二十分鐘依舊不能開機!
終於,設備在系統時間為1970年1月2日零點三十多分的時候進入了正常界面,BTW沒想到的是輸入鎖屏密碼竟然有十來秒的延遲,然後設備又自動重啟了!然後就一直白屏、發燙直到沒電… 嗯,當時整個人的狀態是這樣的:
No Zuo No Die Why You Cry,You Try You Die Don't Ask Why.
蘋果客服給出了一個強制恢復方法:
使用這一方法時建議最好采用windows機器來進行操作。
到這一步時,選擇更新或者恢復均可。
接著iTunes將會下載1.8個G的iOS9.2.1系統文件,下載完成將進行軟件提取、恢復操作:
恢復階段時iTunes、蘋果均會顯示進度條:
之後只需耐心等待數十分鐘即可。
如果之前未進行數據備份,通過這種方法對iPhone進行恢復後原有數據將全部丟失!
那麼是否還有其他方法呢?答案是有的。那就是:拆機並拆出電池,放置10分鐘後重新安裝。(這一方法未進行驗證,如不想數據丟失的小伙伴可嘗試一下)
為什麼會有這個Bug?(下面答案內容來自feomg@知乎)
iOS系統時間使用Unix時間戳(Unix epoch)表示(time_t數據類型)。在系統中,使用系統位數個二進制位儲存時間。Unix時間戳規定:UTC時區的1970年1月1日 0點0時0秒的值為0,以秒為單位,即每過一秒,二進制數字加1。
在32位系統中,time_t是長度為32位的,有符號整數(signed int)類型。首個二進制位是符號位,用來儲存正負。正數則為1970/1/1以後的時間,負數反之;其余的31位用來記數。當時間到達2038年1月19日 3時14分08秒時,數值位全部向前進1,導致符號位被置1,其余31位為0。介時,將出現『時間回歸』的情況,系統時間變為1901年12月13日 20時45分52秒,系統將會出現錯誤。
那麼64位系統中又是怎樣的問題呢?我們說到了以UTC時區的1970年1月1日 0點0時0秒為界限,數值為0,時間正常流逝為正數,反之為負數。不過各位需要留意的是,時間受到時區的影響。
假設一種情況,我原來是北京時區,假設將時間設置到了1970年1月1日0點0時0秒,那麼我將這個時間轉換為UTC時間,公式:北京時間= GMT+8 = UTC+8,那麼UTC時間則為1969年12月31日16時0分0秒。這樣就會出現時間負值,即時間回歸bug觸發,系統啟動卡在Kernel階段,時間錯誤,無法繼續進行啟動。
蘋果是如何回應的?
蘋果官方對這一事件做出了回應,確認如果將系統時間手動設置為1970年5月或者更早,iPhone、iPad、iPod touch將會無法重啟。
蘋果稱會在未來的軟件更新中解決這個問題,但不清楚會在如今的iOS 9.2.2上直接OTA,還是得等下個月的iOS 9.3。
蘋果建議已經變磚的用戶聯系蘋果售後,但是現在Apple Store裡的很多員工都頭疼死了:因為不少人很好奇這個Bug,但捨不得拿自己的iPhone做試驗,就跑到蘋果店裡把人家的展示用iPhone、iPad給玩死了……
蘋果的這一問題不禁讓人想起:linux 2.6.18-164以下版本內核在處理閏秒事件的問題以及千年蟲(計算機2000年問題,縮寫為“Y2K”)
Linux內核閏秒問題
這一問題發生在2012年7月,當時水木社區用戶稱:低內核版Linux開啟NTP服務將會在本月遇到閏秒BUG,從而導致服務器重啟。該用戶表示:國際地球自轉和參考坐標系統服務(IERS)將在格林威治時間2012年6月30日午夜增加一閏秒。
由於Linux kernel和Posix關於NTP時間跳變的標准不同,將在2012年6月30日23:59:59跳變到2012年7月1日後引起ntpd進程鎖死,從而造成部分開啟ntp服務的linux系統重啟。Linux內核在2.6.18-164.e15之後的版本中解決了這個問題。
格林威治時間對應到北京時間即7月1日的7點59分59秒,中國也曾於這個時間全球同步進行閏秒調整,出現了7點59分60秒的特殊現象。
千年蟲問題
百科上的資料顯示:計算機2000年問題,又叫做“千年蟲”、“電腦千禧年千年蟲問題”或“千年危機”。縮寫為“Y2K”。是指在某些使用了計算機程序的智能系統(包括計算機系統、自動控制芯片等)中,由於其中的年份只使用兩位十進制數來表示,因此當系統進行(或涉及到)跨世紀的日期處理運算時(如多個日期之間的計算或比較等),簡單來說,就是由於早期的計算機配置比較低,為了節省空間就把年份只用後兩位數表示,如1900就表示為00,這樣到新千年時便會出現問題了:電腦把2000年認為是1900年。就會出現錯誤的結果,進而引發各種各樣的系統功能紊亂甚至崩潰。因此從根本上說千年蟲是一種程序處理日期上的bug,而不是病毒。