__rdtsc/__rdtscp是否适用于ARM Mac M1/M2?

ttcibm8c  于 2022-12-11  发布在  Mac
关注(0)|答案(1)|浏览(321)

我想在我的代码中插入一些时间度量。在x64上我使用__rdtscp。在mac m1/m2上有类似的东西吗?特别是一些不是系统调用和高分辨率的东西。

5f0d552i

5f0d552i1#

只需使用clock_gettime(CLOCK_MONOTONIC,...)
这是一个VDSO函数。这意味着 kernel 将代码注入到“做正确事情”的用户空间程序中,因此用户空间程序可以访问时间戳计数器,而 * 无需 * 执行系统调用。
在x86上,它[通常]会调用rdtsc [或PET],并调整计数器值以表示纳秒。
在arm上,TSC是一个控制寄存器,只能在内核模式下访问。但是,更高端的arm arches允许通过用户空间Map它以进行R/O访问。内核启用Map。然后,VDSO片段将知道如何通过Map访问值。
clock_gettime的调用是 fast,快到不值得直接访问计数器寄存器。
同样,直接访问计数器也没有什么意义,因为我们仍然需要将其转换为标准单位(例如纳秒),VDSO代码段将完成这一工作。

更新日期:

这也是macOS上的VDSO调用吗?- fuz
我对ARM的直接体验是在nVidia Jetson上[在linux下]。
但是,AFAIK,macOS提供了[必须提供] clock_gettime
在较旧的内核上,它 * 可能 * 必须发出一个等同的系统调用。
但是,由于 * 体系结构 * 提供了直接访问给定操作系统/内核的用户空间的方法,因此有充分的理由相信VDSO方法在macOS下也是可用的。https://www.unix.com/man-page/osx/7/vdso/
了解具体机制的方法是构建一个使用clock_gettime的程序,并[使用gdb]单步执行它。然后,有可能让gdb反汇编clock_gettime代码。
我们 * 必须 * 使用gdb [与objdump和/或readelf相比]进行反汇编,因为代码片段是由内核动态加载/注入的,因此不容易通过静态分析访问。
此外,注入的代码可以是特定于处理器 * 型号 * 的。内核在 Boot 期间探测CPU架构及其特性。它根据找到的特性制作代码片段。
使用gdb是我检查clock_gettime [大约3年前的一个商业产品]的方法,以验证它是否可以在没有系统调用的情况下访问H/W,以及它是否提供了正确的纳秒值。

相关问题