x86_64上的OSX gettimeofday系统调用似乎不起作用

时间:2015-02-13 21:47:29

标签: macos x86-64 system-calls gettimeofday

我正在使用64位代码通过syscall指令调用gettimeofday。

我无法得到任何结果,并且通过Dtrace告诉我该调用没有错误,但是我从调用中返回的寄存器是垃圾。

我执行以下操作:

lea rdi, [rel timeval]   ;buffer for 16bytes
mov rsi, 0               ;no need of timezone
mov rax, 0x2000074       ;gettimeofday
syscall

返回时,rax既不是0也不是-1,缓冲区永远不会得到任何数据。

请有人检查一下,看看他们是否可以接听电话。我不知道发生了什么。

最好的问候

克里斯

ps这是我刚试过的示例代码,除了0之外它不会返回任何内容。

    SECTION .text

    global _main
_main:
    lea rdi, [rel buffer]
    mov rsi, 0
    mov rax, 0x2000074
    syscall

    mov rdi, [rel buffer]
    mov rax, 0x2000001
    syscall

    SECTION .data
buffer:
    times 16 db 0

1 个答案:

答案 0 :(得分:0)

根据API,您需要指出:

1)RDI到timeval结构:

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

DarwinTime是一个QWORD,DarwinSuSeconds是一个DWORD。

2)RSI到时区结构。
如果您不喜欢它的输出,只需将其指向2xQWORD暂存缓冲区即可。

3)RDX到mach_absolute_time结构
这是一个1xQWORD缓冲区

将上面的RSI,RDX,RDI之一设置为0x0而不是指针可能会被拒绝,因为它会触发内部异常。 (检查返回值是否为-EFAULT。)


还请注意,POSIX弃用gettimeofday,而推荐使用clock_gettime(具有秒/纳秒的时间结构),因此您可能要改用它。