我想在我的代码中插入一些时间度量。在x64上我使用__rdtscp。在mac m1/m2上有类似的东西吗?特别是一些不是系统调用和高分辨率的东西。
5f0d552i1#
只需使用clock_gettime(CLOCK_MONOTONIC,...)这是一个VDSO函数。这意味着 kernel 将代码注入到“做正确事情”的用户空间程序中,因此用户空间程序可以访问时间戳计数器,而 * 无需 * 执行系统调用。在x86上,它[通常]会调用rdtsc [或PET],并调整计数器值以表示纳秒。在arm上,TSC是一个控制寄存器,只能在内核模式下访问。但是,更高端的arm arches允许通过用户空间Map它以进行R/O访问。内核启用Map。然后,VDSO片段将知道如何通过Map访问值。对clock_gettime的调用是 fast,快到不值得直接访问计数器寄存器。同样,直接访问计数器也没有什么意义,因为我们仍然需要将其转换为标准单位(例如纳秒),VDSO代码段将完成这一工作。
clock_gettime(CLOCK_MONOTONIC,...)
VDSO
rdtsc
clock_gettime
更新日期:
这也是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,以及它是否提供了正确的纳秒值。
gdb
objdump
readelf
1条答案
按热度按时间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,以及它是否提供了正确的纳秒值。