V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wszgrcy
V2EX  ›  Node.js

node 上的获取当前时间是调用系统的 api 吗?

  •  
  •   wszgrcy · 2020-01-22 21:14:21 +08:00 via Android · 8296 次点击
    这是一个创建于 1785 天前的主题,其中的信息可能已经有所发展或是发生改变。

    虽然 js 不是直接跑在系统里的,但是还是想知道点 node 和系统之间的关系,比如获得时间是不是也是调用的系统 api,和在 windows 下用 ffi 调用它的 api 是否能获得相同的结果?有这方面的大佬吗

    8 条回复    2020-01-23 03:27:54 +08:00
    no1xsyzy
        1
    no1xsyzy  
       2020-01-22 21:55:17 +08:00
    你除了调用系统 API 还能怎么做?
    1、直接和硬件沟通读 CMOS 时间;
    2、网络时间。

    1 的话,我不知道怎么操作,但结果和系统时间一样,因为系统时间也就是 CMOS 时间…… 除非被 LD_PRELOAD 之类替换掉 syscall ?
    2 的话,其中包含 “需要联网” 这一前提和 “通过 NTP 协议进行了交互” 这一 side effect,应当显式指明。
    yafoo
        2
    yafoo  
       2020-01-23 00:06:51 +08:00 via Android
    @no1xsyzy 看到问题,我也在想怎么读取时间,你的回答一下打开了思路,貌似只能调用系统 api
    monsterxx03
        3
    monsterxx03  
       2020-01-23 00:09:54 +08:00 via iPhone   ❤️ 1
    你写个程序在死循环里不停取时间,然后 strace 看它用了什么 syscall 就知道了
    azh7138m
        4
    azh7138m  
       2020-01-23 00:31:31 +08:00
    是的,见 https://sourcegraph.com/github.com/v8/v8@4b9b23521e6fd42373ebbcb20ebe03bf445494f9/-/blob/src/base/platform/time.cc?utm_source=share#L306:7
    posix 下用了 gettimeofday
    win 下会分两种情况做讨论
    都会用到 GetSystemTimeAsFileTime
    azh7138m
        5
    azh7138m  
       2020-01-23 00:34:27 +08:00
    = = 我应该去掉小尾巴的
    不过都在这个文件里面,上下翻一下就行了
    JSDate 最后应该是调到这个地方的
    yangkeao
        6
    yangkeao  
       2020-01-23 01:56:14 +08:00 via Android
    @monsterxx03 clock_gettime 很巧的是大部分时候 strace 看不见,因为时间相关可以用 vDSO,而不用真的 syscall。

    既然是 vDSO,那么它就能在用户态实现。实现上根据要求的精度不同会有差异,其中之一落到 rdtsc 指令
    yangkeao
        7
    yangkeao  
       2020-01-23 02:01:37 +08:00 via Android   ❤️ 1
    至于是如何调用的,就得具体情况具体分析。如果通过 glibc 调用 clock_gettime 函数,那么会走 vDSO。

    也可以像 go runtime 做的那样,直接解析 auxv、解析符号、调用 vdso。

    也可以直接 syscall 225 (大概是这个数,不确定),这样就不是通过 vdso 的,strace 就能看见。当然,在一些极端情况下,vdso 会 fallback 到系统调用上。

    node 是啥情况可能得自己探索一番,也无外乎这几样了。

    (最近了解了一些这方面知识,因为在做一个运行时注入程序修改时间的工具😅用来做 chaos )
    ysc3839
        8
    ysc3839  
       2020-01-23 03:27:54 +08:00 via Android
    @azh7138m 想问一下“win 下会分两种情况做讨论”具体是什么情况?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2858 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:43 · PVG 20:43 · LAX 04:43 · JFK 07:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.