1

有人可以解释一下内核日志中的时间戳差异吗?

我们编写了一个应用程序来在指定时间唤醒 Android,该应用程序利用AlarmManagerAPI 并设置:

AlarmManager.ELAPSED_REALTIME_WAKEUP

该应用程序按预期工作,并在用户指定的时间正确唤醒。但是内核时间戳存在差异。AlarmManagerService.java我从to跟踪源代码alarm-dev.c并确认 Android 正确设置了闹钟唤醒时间并将其发送到内核(例如,从 Java 层 Android 用于SystemClock.elapsedRealtime()获取经过时间并添加 100 秒并将值转换为秒和纳秒和最后通过JNI发送到内核层)。

但是,在读取dmesg日志时,内核时间戳似乎存在差异。在调用具有状态的函数alarm_ioctl时打印以下消息:ANDROID_ALARM_SET(0):dmesg

[20450.036529] alarm 2 set 20544.720000000

这意味着这[20450.036529]是当前时间,20544.720000000也是AlarmManager唤醒 Android 的时间。该值20544.720000000是从 Android 层和 logcat 的时间戳(例如logcat -v time)设置的,该值是 Android 应该唤醒的时间。

从 Android 层到内核层只需要不到十分之一秒,但为什么增量是94.6834715.316529比它应该的要小?或者经过的时间与打印的内核时间不同dmesg

另一个有趣的观察是,如上所述,应用程序确实在用户指定的时间唤醒。所以在这种情况下,用户调用应用程序AlarmManager后,平板电脑会在 100 秒内唤醒。

谢谢,

参考:

4

1 回答 1

1

选项1

您可能希望在消息中嵌入时间戳,而不是依赖于 printk() 生成的时间戳。这种方法至少应该给你一个真正的时间衡量标准。

选项 2

您可以调查kernel/printk.c使用的 API来获取时间戳。

如果printk正在使用 cpu_clock() 您可能需要考虑以下几点:

中央处理器时钟

 14  * What:
 15  *
 16  * cpu_clock(i) provides a fast (execution time) high resolution
 17  * clock with bounded drift between CPUs. The value of cpu_clock(i)
 18  * is monotonic for constant i. The timestamp returned is in nanoseconds
于 2013-02-19T03:54:14.760 回答