wszgrcy
V2EX  ›  Node.js

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

  •  
  •   wszgrcy · Jan 22, 2020 via Android · 9262 views
  •   You need to sign in to view this topic
    This topic created in 2424 days ago, the information mentioned may be changed or developed.

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

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

    1 的话,我不知道怎么操作,但结果和系统时间一样,因为系统时间也就是 CMOS 时间…… 除非被 LD_PRELOAD 之类替换掉 syscall ?
    2 的话,其中包含 “需要联网” 这一前提和 “通过 NTP 协议进行了交互” 这一 side effect,应当显式指明。
    yafoo
        2
    yafoo  
       Jan 23, 2020 via Android
    @no1xsyzy 看到问题,我也在想怎么读取时间,你的回答一下打开了思路,貌似只能调用系统 api
    monsterxx03
        3
    monsterxx03  
       Jan 23, 2020 via iPhone   ❤️ 1
    你写个程序在死循环里不停取时间,然后 strace 看它用了什么 syscall 就知道了
    azh7138m
        4
    azh7138m  
       Jan 23, 2020
    是的,见 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  
       Jan 23, 2020
    = = 我应该去掉小尾巴的
    不过都在这个文件里面,上下翻一下就行了
    JSDate 最后应该是调到这个地方的
    yangkeao
        6
    yangkeao  
       Jan 23, 2020 via Android
    @monsterxx03 clock_gettime 很巧的是大部分时候 strace 看不见,因为时间相关可以用 vDSO,而不用真的 syscall。

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

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

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

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

    (最近了解了一些这方面知识,因为在做一个运行时注入程序修改时间的工具😅用来做 chaos )
    ysc3839
        8
    ysc3839  
       Jan 23, 2020 via Android
    @azh7138m 想问一下“win 下会分两种情况做讨论”具体是什么情况?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2987 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:45 · PVG 13:45 · LAX 22:45 · JFK 01:45
    ♥ Do have faith in what you're doing.