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

问题描述 投票:1回答:1

我正在使用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
macos x86-64 system-calls gettimeofday
1个回答
0
投票

根据API,您需要指出:

1)RDI到时间结构:

_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(具有秒/纳秒时间结构),因此您可能希望使用它。

© www.soinside.com 2019 - 2024. All rights reserved.