【问题标题】:Value of syscall_time in macOS High SierramacOS High Sierra 中 syscall_time 的值
【发布时间】:2018-10-10 22:22:04
【问题描述】:

我正在编写汇编程序,我想使用设备的当前时间。在 Linux 中,有一个编号为 201 的系统调用,它返回从 1970 年初开始的秒数。有人知道 macOS 中相应系统调用的值是多少吗?

【问题讨论】:

  • 116 AUE_GETTIMEOFDAY ALL { int gettimeofday(struct timeval *tp, struct timezone *tzp) NO_SYSCALL_STUB; } 116 十进制(0x74 十六进制)是 32 位系统调用。64 位系统调用号必须添加 0x2000000。系统调用表可以在这里找到:opensource.apple.com/source/xnu/xnu-2782.20.48/bsd/kern/…

标签: macos nasm x86-64 system-calls


【解决方案1】:

感谢您的帮助,我已经找到了解决方案。您可以在下面找到如何将时间加载到缓冲存储中

macOS

load_time:
   mov rax, 0x2000074
   lea rdi, [rel buffer]
   mov rsi, 0
   syscall
   ret

您提供指向缓冲区的指针作为参数以检索结构形式的数据

_STRUCT_TIMEVAL {
    __darwin_time_t         tv_sec;         /* seconds */
    __darwin_suseconds_t    tv_usec;        /* and microseconds */
};

在 Linux 的情况下,仅返回秒数

load_time
    mov rax, 201
    mov rdi, 0
    syscall
    mov [rel buffer], rax
    ret

【讨论】:

  • 我正试图做到这一点,但被系统调用弄糊涂了。您正在使用:0x2000074,不应该是 0x2000116 吗?另外,您如何从缓冲区访问秒数和微秒数?谢谢
  • opensource.apple.com/source/xnu/xnu-2782.20.48/bsd/kern/…。您需要的函数编号为116。它是一个十进制数,我们需要将其转换为十六进制,即 0x74 ,然后添加 0x2000000 。这就是为什么我使用 0x2000074
  • 一旦您执行系统调用,您的缓冲区将充满秒和微秒。在我的机器上,结构的大小是 16 字节。将第一个值读取到寄存器调用mov rdi, [rel buffer]。该值将在rdi(整个寄存器,64 位)中。读取微秒lea rax, [rel buffer]获取指针然后mov rdi, [rax + 64]
  • 谢谢。这澄清了这两个问题。现在就试试。
  • 尝试计算经过的时间。我得到一个 start_time 和 end_time 并计算差异。不知何故,微秒总是显示为零。我可能做错了什么?
【解决方案2】:

为了补充您的答案,我发现了一种非常简单的方法来访问秒和微秒,方法是声明:

timeval:
    tv_sec  dq 0
    tv_usec dq 0

timestr db "Secs: %ld and microsecs: %ld", 10, 0

完成后:

    mov         rax, 0x2000074
    lea         rdi, [timeval]
    mov         rsi, 0          
    syscall

然后您可以按名称访问每个文件,例如打印:

    lea         rdi, [timestr]     
    mov         rsi, [tv_sec]
    mov         rdx, [tv_usec]
    call        _printf 

【讨论】:

  • 对于高精度计时,您可能需要clock_gettime 而不是gettimeofday(如果是这样的话)。甚至更好的是,如果 MacOS 在用户空间有办法在没有内核往返的情况下获得时间,那将是更低的开销。 (例如在 GNU/Linux 上,clock_gettime 库函数可以使用内核 (VDSO) 导出的代码+数据在用户空间中执行 rdtsc 并缩放结果)
  • 你是对的,但 macOS 没有clock_gettime。似乎还有其他一些替代方法,例如 mach_absolute_time() 我需要弄清楚如何通过 nasm 访问。
  • 你的意思不是作为系统调用,或者根本不是? clock_gettime(2) 由 POSIX 2001 标准化,但它可以是其他一些系统调用之上的库函数。我很好奇,所以我搜索; clock_gettime alternative in Mac OS X 是的,显然 mach_absolute_time 是从 C 语言的方式。你当然可以从 nasm 调用 libc 实现。
  • 谢谢。这是一篇很好的文章,解释了 mach_absolute_time 的使用:jonathanbeard.io/tutorials/Timing.html
猜你喜欢
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2018-12-05
  • 2018-03-07
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多