x86_64上的OSX 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,缓冲区从不获取任何数据。

请有人检查一下,看看他们是否能接到工作电话。我不知道发生了什么事。

致以最诚挚的问候

Chris

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

根据API,您需要指向:

1) RDI到时间段结构:

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

达尔文时间是QWORD,达尔文秒是DWORD。

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

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

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


还要注意,POSIX反对gettimeofday而支持clock_gettime(它有一个秒/纳秒的时间结构),所以您可能需要使用它。

相关内容

  • 没有找到相关文章

最新更新