我知道我必须使用:rdtsc。测量的函数是确定性的,但结果远不能重复(每次运行我得到 5% 的振荡)。
可能的原因有:
您还知道其他原因吗?
如何消除它们?
TSC(什么rdtsc使用)在多处理器系统上通常不同步。它可能有助于设置 CPU 关联性,以便将进程绑定到单个 CPU。
您还可以从以下位置获取时间戳HPET定时器 http://en.wikipedia.org/wiki/HPET如果可用,则不易出现相同的问题。
至于重复性,这些差异是真实的。您可以禁用缓存,为进程提供实时优先级和/或(如果在 Linux 或类似的系统上)以较低的固定计时器中断频率(执行时间切片的频率)重新编译内核。您无法完全消除差异,至少不容易,而且在常规 CPU + 操作系统组合上更是如此。
一般来说,出于易于编码、可靠性和可移植性的原因,我建议您使用操作系统提供的功能。如果它提供高精度计时器,请使用适当的操作系统助手。
(以防万一您尝试对加密系统进行时间攻击,那么,您将不得不忍受 1. 这种随机性和 2. 出于充分原因使系统不可预测的一般防御,因此该函数可能不会时间上具有确定性。)
编辑:添加了有关操作系统可以提供的计时器的段落。
编辑:这是指Linux。要将进程绑定到单个 CPU(以便从 RDTSC 准确读取),您可以使用sched_setaffinity(2) http://linux.die.net/man/2/sched_setaffinity. And here http://repo.or.cz/w/kmemtrace-user.git?a=blob;f=kmemtraced.c;h=217478ddca954a9d3fc4c4c99bd9f3c93e498bb1;hb=0d00b11cc4badc1da3313fd84335efedde27ad83#l73我的一个项目中的一些代码将其用于其他目的(将线程映射到 CPU)。这应该是您的第一次尝试。对于 HPET,您可以使用常规 POSIX 调用,例如,只要内核和机器支持这些定时器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)