【问题标题】:OSX gettimeofday syscall on x86_64 seems to not workx86_64 上的 OSX gettimeofday 系统调用似乎不起作用
【发布时间】:2015-04-15 01:37:59
【问题描述】:

我正在使用 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

【问题讨论】:

  • 你能发布你用来编译这个的命令以防万一吗?
  • 对不起,应该阅读的人:rdi、rsi 和 rax!我只是在这里打错了,代码确实使用了rdi、rsi和rax!
  • 这是我使用 NASM 编译的代码和平的一部分,我使用它来编译:nasm -f macho64 main.nasm,然后链接:ld -macosx_version_min 10.6 -o main -e _main main.o
  • 如果有人想查看完整代码,请在此处获得:github.com/vygr/Asm-Kernel,我的最后一个签入条目禁用了非工作调用,请随时取消注释并自己尝试。
  • 有问题的代码在文件 sys/task_sleep 中,该代码的第一部分试图进行 gettimeofday 调用。它无法返回任何东西。我正在使用 NASM 'altreg' 设置,以便注册 rdi == r7、rsi ==r6、rax == r0。系统调用宏可以在 syscall.inc 中找到。

标签: macos x86-64 system-calls gettimeofday


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2013-11-21
    • 2014-03-26
    • 2017-04-19
    • 2020-04-05
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多