转载

苹果"1970 事件" 让我们看看是什么"鬼"

近日,苹果“1970 事件”闹得沸沸扬扬,有许多使用iOS设备的好奇人士“好奇害死猫”,抱着好奇的态度,结果自己的爱机真的变砖了。据了解,运行iOS 8以上系统的64位处理器的设备几乎无一幸免,把iPhone、iPad或iPod touch的时间设定为1970年1月1日,然后关机再开机,手机就变成一块“砖头”。下面让我们看看“1970”到底是什么“鬼”。

苹果"1970 事件" 让我们看看是什么"鬼" 苹果"1970 事件" 让我们看看是什么"鬼"

知识储备:Unix时间戳

在了解“1970年事件”时,我们需要了解一个知识就是Unix时间戳。iOS系统时间使用Unix时间戳(Unix epoch)表示(time_t数据类型)。在系统中,使用系统位数个二进制位储存时间。Unix时间戳规定,UTC时区的1970年1月1日0点0时0秒的值为0,以秒为单位,即每过一秒,二进制数字加1。

有了这个知识储备,我们现在了解一下搭载64位处理器的iOS设备的时间bug。我们说到了以UTC时区的1970年1月1日0点0时0秒为界限,数值为0,时间正常流逝为正数,反之为负数。不过各位需要留意的是,时间受到时区的影响。

苹果"1970 事件" 让我们看看是什么"鬼"

图为 iOS手机

假设一种情况,我原来是北京时区,假设将时间设置到了1970年1月1日0点0时0秒,那么我将这个时间转换为UTC时间,公式:北京时间=GMT+8=UTC+8,那么UTC时间则为1969年12月31日16时0分0秒。这样就会出现时间负值,即时间回归bug触发,系统启动卡在Kernel阶段,时间错误,无法继续进行启动。

那么既然事件不能往前调,好奇的朋友可能会往后调,当我们往后调的时候会发现iOS系统可以设置的最大时间是2038年1月1日,并不能再往后设置了。为什么时间只能调到这里?

苹果"1970 事件" 让我们看看是什么"鬼"

手机时间计算原理

我们了解一下在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秒,系统将会出现错误。

原文  http://mobile.zol.com.cn/569/5691666.html
正文到此结束
Loading...