这个计算是如何工作的

How is this Calculation working?

本文关键字:工作 何工作 计算      更新时间:2023-10-16

我遇到过这段代码,其中计算了从epoc到boot的纳秒数,但我没有得到如何计算?

http://code.metager.de/source/xref/cloudius-systems/osv/arch/aarch64/arm-clock.cc # 61

 s64 arm_clock::uptime()  
{
    u64 cntvct;
    asm volatile ("isb; mrs %0, cntvct_el0; isb; " : "=r"(cntvct) :: "memory");
    cntvct = ((__uint128_t)cntvct * NANO_PER_SEC) / this->freq_hz;
    return cntvct; 
}

CNTVCT是循环计数器寄存器,为什么这个寄存器的值除以CPU频率,然后乘以NANO_PER_SEC?

另外,如何从这些纳秒中推导出一天的时间呢?

为什么这个寄存器的值除以CPU频率,然后乘以NANO_PER_SEC?

转换单位

CNTVCT每个时钟周期递增

频率为时钟周期/秒

NANO_PER_SEC是纳秒/秒

看一下:

的单位
CNTVCT * NANO_PER_SEC
-------------
frequency   

:

clocks * nano/sec
------------------------
clocks/sec

=(分子分母同时乘以sec)

clocks * nano
-------------
clocks

=(分子分母同时除以clocks)

nano

所以你需要除以频率得到秒乘以纳米得到纳秒

另外,如何从这些纳秒中推导出一天的时间呢?

表示从启动时间开始的纳秒数,而不是epoch

但是,您可以获得当前时间,减去当前纳秒,然后按纳秒进行调整