首页 > 其他分享 >【转】内核的时间函数

【转】内核的时间函数

时间:2023-10-09 15:14:59浏览次数:55  
标签:qdf 函数 clock tv get 时间 内核 time struct

因为需要在kernel tee driver中做个获取时间的测试,才有了这次搜索。

这篇比较符合需求:https://www.dingmos.com/index.php/archives/38/,感谢这位博主!

问题分析中看到的一些点:

auth_token_table.h中获取时间:

    explicit AuthTokenTable(size_t max_entries = 32, time_t (*clock_function)() = clock_gettime_raw)
        : max_entries_(max_entries), last_off_body_(clock_function()),
          clock_function_(clock_function) {}
time_t clock_gettime_raw() {
    struct timespec time;
    clock_gettime(CLOCK_MONOTONIC_RAW, &time);
return time.tv_sec;
}

首先上面的clock_gettime在kernel driver中不可用。

其次,搜索了下本地的代码,看到有地方用了do_gettimeofday,但实测下来在目前的版本中,也是不可行的。网上有看到do_gettimeofday的使用受限于内核版本。

opengrok检索了下,确实有通过版本区分的,如:

vip_uint64_t  gckvip_os_get_time(void)
{
    vip_uint64_t time = 0;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
    struct timespec64 tv;
    /* Return the time of day in microseconds. */
    ktime_get_ts64(&tv);
    time = (vip_uint64_t)((tv.tv_sec * 1000000ULL) + (tv.tv_nsec / 1000));
#else
    struct timeval tv;
    do_gettimeofday(&tv);
    time = (vip_uint64_t)((tv.tv_sec * 1000000ULL) + tv.tv_usec);
#endif

    return time;
}

再比如:

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0))
unsigned long qdf_mc_timer_get_system_time(void)
{
    struct timespec64 tv;

    ktime_get_real_ts64(&tv);
    return tv.tv_sec * 1000 + tv.tv_nsec / 1000000;
}
qdf_export_symbol(qdf_mc_timer_get_system_time);

#else
unsigned long qdf_mc_timer_get_system_time(void)
{
    struct timeval tv;

    do_gettimeofday(&tv);
    return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}
qdf_export_symbol(qdf_mc_timer_get_system_time);
#endif

本地内核版本5.4,所以就不能用do_gettimeofday了。

以下函数测试正常。

 

标签:qdf,函数,clock,tv,get,时间,内核,time,struct
From: https://www.cnblogs.com/xiululu/p/17751762.html

相关文章

  • entity-framework 'scaffold-dbcontext' 未被识别为 cmdlet、函数、脚本文件或可操
    //出现此错scaffold-dbcontext:Theterm'scaffold-dbcontext'isnotrecognizedasthenameofacmdlet,function,scriptfile,oroperableprogram.Checkthespellingofthename,orifapathwasincluded,verifythatthepathiscorrectandtry......
  • Linux文件时间
    查看文件时间stat命令使用statfilename命令来查看文件时间AccessTime:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间。(cat、less)ModifyTime:简写为mtime,表示文件内容的更改时间,当文件的数据内容被修改时,更新这个时间。(vim)ChangeTime:简写为ctime,表示文件的改动......
  • 函数调用
    P7077[CSP-S2020]函数调用我们考虑如果没有第三种函数,如何解决这个问题。发现,对于每个1(1类),我们考虑在它之后执行了多少个2,然后累乘,就是这个增加操作实际的贡献。我们只需要倒序,维护一个后缀积即可。我们的核心思想就是计算每个1的贡献是几倍。考虑有3会怎么样。还是延续上面......
  • js函数,js对象
    1定义一个函数21.functionfuctionName(参数1,参数2){3//要执行的代码4return要返回的结果5}6782.varfunctionName=function(a,b)91011ES6箭头函数:(...)=>{...}12arr.forEach((e)=>{13console.log(e);14})基础对象模......
  • 有效解决VC++6.0一个工程不能有多个main函数的解决方案
    对于初学者来说,需要做很多练习,就需要创建多个main()函数,但C语言只能有一个main()函数,那么通常的做法就是:【方法一】:讲其他文件中的main()函数注释掉,但该方法比较费时费力,不推荐【方法二】:在VC++6.0中,在工程左边fileview里工程下的sourcefiles中,选中前一个带main函数的文件, ......
  • [完结16章]React18内核探秘:手写React高质量源码迈向高阶开发
    点击下载——[完结16章]React18内核探秘:手写React高质量源码迈向高阶开发  提取码:8epr手写React高质量源码,迈向高阶开发React18内核探秘:手写React高质量源码迈向高阶开发batching批处理,说的是,可以将回调函数中多个setState事件合并为一次渲染,因此是异步的。解决的问题是......
  • linux 内核五大模块:网络通信
    网络通信网络通信是一种把不同计算机或网络设备连接到一起的技术,本质上是跨系统的进程间通信,必须要通过网络(硬件)才能进行。随着高并发、分布式、云计算、微服务等技术的普及,网络的性能也变得越来越重要。一、网络模型1.1OSI模型为了解决网络互联中异构设备的兼容性问题,并解......
  • MySQL之分组函数学习
    分组函数:用作统计使用,又称为聚合函数或统计函数 分类:sum求和、avg平均值、max最大值、min最小值、count计算个数 特点:sum、avg一般用于处理数值型max、min、count可以处理任何类型 可以和distinct搭配实现去重的运算selectsum(distinctsalary),sum(sala......
  • MySQL DATEDIFF() 函数
    定义和用法DATEDIFF()函数返回两个日期之间的天数。语法DATEDIFF(date1,date2)date1 和 date2 参数是合法的日期或日期/时间表达式。注释:只有值的日期部分参与计算。实例例子1使用如下SELECT语句:SELECTDATEDIFF('2008-12-30','2008-12-29')ASDiffDate 例子2使用如下SE......
  • C语言 - malloc与free函数
    C 内存管理本章将讲解C中的动态内存管理。C语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。在C语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字......