2015-05-14 62 views
2

我使用这个代码,以确定我的iOS设备重启最后:iOS可以引导时间漂移吗?

int mib[MIB_SIZE]; 
size_t size; 
struct timeval boottime; 

mib[0] = CTL_KERN; 
mib[1] = KERN_BOOTTIME; 
size = sizeof(boottime); 
if (sysctl(mib, MIB_SIZE, &boottime, &size, NULL, 0) != -1) { 
    return boottime.tv_sec; 
} 

return 0; 

我看到一些异常与此时间。特别是,我保存了很长时间,几天和几周后,检查了上面代码返回的值保存了多久。

我不确定,但我想我正在看到一些漂移。这对我来说没有任何意义。我不转换为NSDate以防止漂移。我认为启动时间是由内核启动时记录的,不再计算,只是存储。但是,iOS是否可以将启动时间节省为NSDate,并有任何固有的漂移问题?

+0

你能举一个你正在看到的漂移的例子吗? – trojanfoe

+0

保存的启动时间和“计算”启动时间之间至少有5秒的差异。我会期望零漂。而且......我甚至可能不会漂流,我只是根据来自现场的错误报告做一些侦探工作。我从来没有见过启动时间有所不同。这里有一个权威的回答,“是的,它可以漂移”使得修复更容易。 –

+0

我的iPad Mini 3在周末漂移48秒! –

回答

3

虽然iOS内核是封闭源码,但可以合理地假设它大部分与OSX内核相同,即OSX内核open-source

osfmk/kern/clock.c有以下功能:

/* 
* clock_get_boottime_nanotime: 
* 
* Return the boottime, used by sysctl. 
*/ 
void 
clock_get_boottime_nanotime(
    clock_sec_t   *secs, 
    clock_nsec_t  *nanosecs) 
{ 
    spl_t s; 

    s = splclock(); 
    clock_lock(); 

    *secs = (clock_sec_t)clock_boottime; 
    *nanosecs = 0; 

    clock_unlock(); 
    splx(s); 
} 

clock_boottime声明为:

static uint64_t  clock_boottime;    /* Seconds boottime epoch */ 

终于到这一功能的评论表明,它确实能变化:

/* 
* clock_set_calendar_microtime: 
* 
* Sets the current calendar value by 
* recalculating the epoch and offset 
* from the system clock. 
* 
* Also adjusts the boottime to keep the 
* value consistent, writes the new 
* calendar value to the platform clock, 
* and sends calendar change notifications. 
*/ 
void 
clock_set_calendar_microtime(
    clock_sec_t   secs, 
    clock_usec_t  microsecs) 
{ 
    ... 

更新至回答查询从OP

我不确定多久调用一次clock_set_calendar_microtime(),因为我不熟悉内核的内部工作原理;然而它调整了clock_boottime的值,并且clock_bootime的值在clock_initialize_calendar()中初始化,所以我可以说它可以被调用多次。我一直无法找到任何使用它的电话:

$ find . -type f -exec grep -l clock_set_calendar_microtime {} \; 
+0

clock_set_calendar_microtime仅在内核启动时调用?没关系,如果它被调用一次。当然,值应该改变。但是如果在询问引导时间时调用它,那么这是不好的,因为引导时间将取决于平台时钟,这对我不利。 –

+0

该函数确实调用了“clock_boottime + = secs - clock_calend.epoch;”但是我不清楚谁调用了这个功能。 –

+0

http://devetc.org/code/2014/01/21/timers-clocks-and-cocoa.html是一个有趣的阅读时钟怪才。 –