精华内容
下载资源
问答
  • 2016-06-02 13:26:30

    内核中的时间子系统主要向上层提供两种功能,一个就是时间功能,另一个就是timer定时器功能。

    时间功能:
    时间功能是由内核中的timekeeper模块来负责维护,该模块需要clocksource的支持。内核中的模块划分为如下:
    Timekeeper—>clocksource—>hardware

    定时器功能:
    从原理上说,定时器需要有一个定期到来的tick来驱动它运行,每个tick到来时检查一下定时器是否到时,由此来实现定时器的功能。所以定时器的实现可以分为tick device设备和基于tick device的上层timer定时器实现。在内核中的模块划分如下所示:
    timer—>tick device—>clockevent—>hardware

    基于tick device的timer定时器还分为两种类型,一种是低精度timer,一种是高精度timer。
    低精度timer是旧的内核中的实现,一直延续至今,也就是我们熟悉的基于jiffies系统滴答来实现的,旧的内核中只有这种定时器实现。
    高精度timer是为了满足新的需求而诞生的hrtimer。高精度基本可以满足任何情况下的需求了,但是由于历史原因低精度timer不能直接从内核中删除,必须保持兼容性。
    一个CPU内可能有多个local clock硬件,但是只会有一个被设置为该CPU的tick设备,每个CPU有且只有一个tick设备。

    内核配置

    1、通用clock source和clock event的内核配置

    (1)clock event是为tick设备提供支持的模块,它分为了新版和旧版两种架构。新架构采用的是通用模型,旧架构采用的是平台相关的实现。
    相关的配置项为:CONFIG_GENERIC_CLOCKEVENTS和CONFIG_GENERIC_CLOCKEVENTS_BUILD。
    如果配置了这两个选项,就会使用新的时间子系统的构架,如果不配置,将使用旧的时间子系统架构。 这一项的配置一般是在arch中选择的。比如arch/arm/Kconfig中,而其余的需要根据情况在menuconfig中配置,对应的Kconfig为kernel/kernel/time/Kconfig。

    arch/arm/Kconfig
    config ARCH_OMAP1
        bool "TI OMAP1"
        depends on MMU
        select ARCH_HAS_CPUFREQ
        select ARCH_HAS_HOLES_MEMORYMODEL
        select ARCH_OMAP
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
        select GENERIC_CLOCKEVENTS---选择通用时间框架
        select GENERIC_IRQ_CHIP
        select HAVE_CLK
        select HAVE_IDE
        select IRQ_DOMAIN
        select NEED_MACH_IO_H if PCCARD
        select NEED_MACH_MEMORY_H
        help
          Support for older TI OMAP1 (omap7xx, omap15xx or omap16xx)
    

    如上所示,定义ARCH_OMAP1的时候就已经select GENERIC_CLOCKEVENTS作为时间子系统的框架。

    (2)clocksource是为timekeeper提供支持的模块,目前的内核都是使用新的通用框架。不过为了兼容性考虑,kernel也保留了CONFIG_ARCH_USES_GETTIMEOFFSET这个配置项.

    2、tick device的配置

    如果选择了新的时间子系统的软件架构(配置了CONFIG_GENERIC_CLOCKEVENTS),那么内核会打开Timers subsystem的配置选项,主要是和tick以及高精度timer配置相关。

    tick相关的配置:

    CONFIG_HZ_PERIODIC
    

    无论何时,都启用周期性的tick,即便是在系统idle的时候。

    CONFIG_NO_HZ_IDLE
    

    Idle dynticks system (tickless idle)。在系统idle的时候,停掉tick。使能该选项会自动使能CONFIG_NO_HZ_COMMON选项。

    CONFIG_NO_HZ_FULL
    

    Full dynticks system (tickless)。即便在非idle的状态下,也就是说cpu上还运行在task时,也可能会停掉tick,这个选项和实时应用相关。使能该选项会自动使能CONFIG_NO_HZ_COMMON选项。

    上面的三个选项只能是配置其一,上面描述的是新的内核配置方法。对于旧的内核,只有CONFIG_NO_HZ一个配置项,用来配置idle dynticks system(非idle时有周期性tick,idle时无周期性tick),为了兼容旧的系统,新的内核仍然支持了这个选项。

    除此之外还有一个用来配置tick模式的选项:

    CONFIG_TICK_ONESHOT
    

    如果配置了这个选项,就决定了系统中所有的tick设备都是oneshot mode,否则就是periodic mode。
    当配置了CONFIG_NO_HZ_COMMON或者CONFIG_HIGH_RES_TIMERS的时候,这个选项就会一起被配置上,也就是说采用了dynticks或者hrtimer的系统中,它的tick设备模式必须是oneshot类型的。

    3、timer模块的配置

    CONFIG_HIGH_RES_TIMERS
    

    和高精度timer相关的配置只有一个的配置项。如果配置了高精度hrtimer,那么就会自动配置上CONFIG_TICK_ONESHOT,表示系统只支持one-shot类型的tick device。

    4、 time配置示例

    选择一个时间子系统的构架:
    (1)新的通用时间子系统软件框架(配置了CONFIG_GENERIC_CLOCKEVENTS)
    (2)传统时间子系统软件框架(不配置CONFIG_GENERIC_CLOCKEVENTS,配置CONFIG_ARCH_USES_GETTIMEOFFSET)
    除非维护一个旧的系统,否则建议用新的通用时间子系统框架了,这时候可能的配置包括如下几种情况:
    (1)使用低精度timer和不停的tick(HZ_PERIODIC)
    这种是旧的处理方式
    (2)使用低精度timer和dynamic tick(CONFIG_NO_HZ_IDLE)
    (3)使用高精度timer和不停的tick(HZ_PERIODIC)
    (4)使用高精度timer和dynamic tick(CONFIG_NO_HZ_IDLE)
    这种是时下较流行的配置
    注:上面描述的dynamic tick指的是Idle dynticks system。我们不考虑Full dynticks system的情况。
    采用了dynticks或者hrtimer的系统中,它的tick设备模式必须是oneshot类型的,也就是说上面4种情况,只有第1种情况下的tick 是周期模式的,其他三种都是oneshot mode。

    更多相关内容
  • 内核函数时间获得

    千次阅读 2018-07-25 13:26:59
    功能:此函数用于返回当前内核时间,该时间是距离1970开始的秒和纳秒 返回值: timespec结构体包含秒和纳秒 头文件: #include void getnstimeofday(struct timespec *tv) 功能:此函数用于返回当前内核时间,该时间...

    struct timespec {
            long       tv_sec; 秒数
            long       tv_nsec; 纳秒数
    };

    struct timeval {
        __kernel_time_t        tv_sec;        秒数
        __kernel_suseconds_t    tv_usec; 微妙
    };

    struct rtc_time {
        int tm_sec; //秒0-59
        int tm_min;//分 0-59
        int tm_hour;//时0-23
        int tm_mday;//日 1-31
        int tm_mon;//月0-11
        int tm_year;//从1900年开始算的年
        int tm_wday;//0-6一周中的第几天
        int tm_yday;//0-365 一年中的第几天
        int tm_isdst;//传入的时间是否是 DST(夏令时)
    };

    struct timespec current_kernel_time(void)
    功能:此函数用于返回当前内核时间,该时间是距离1970开始的秒和纳秒
    返回值: timespec结构体包含秒和纳秒
    头文件: #include <linux/time.h>

    void getnstimeofday(struct timespec *tv)
    功能:此函数用于返回当前内核时间,该时间是距离1970开始的秒和纳秒
    参数: timespec结构体指针
    头文件:#include <linux/time.h>

    void do_gettimeofday(struct timeval *tv)
    功能:此函数用于返回当前内核时间,该时间是距离1970开始的秒和微妙
    参数: timeval结构体指针
    头文件:#include <linux/time.h>

    unsigned long get_seconds(void)
    功能:获得自1970:1:1:0:0:0的秒数
    返回值: 秒数
    头文件:#include <linux/time.h>

    unsigned long mktime(const unsigned int year0,const unsigned int mon0,
                         const unsigned int day,  const unsigned int hour,
                         const unsigned int min,  const unsigned int sec)

    功能:将传入的时间转换成自1970-01-01 00:00:00的秒数
    参数:年月日时分秒如2018 10 8 10 10 10
    返回值:秒数
    头文件:#include <linux/time.h>

    struct timespec ns_to_timespec(const s64 nsec)
    功能:转换 纳秒成timespsec{秒,纳秒}结构
    参数:纳秒数
    返回值:timespsec{秒,纳秒}结构
    头文件:#include <linux/time.h>

    struct timeval ns_to_timeval(const s64 nsec)
    功能:转换 纳秒成timeval{秒,微秒}结构
    参数:纳秒数
    返回值:timespsec{秒,微秒}结构
    头文件:#include <linux/time.h>

    void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)
    功能: 获取当前的UTC时间 
    time:当前自1970以来的秒数
    tm : 转换成的可识别的年月日 时分秒 ,年+1900 月+1,时+8(时区)
    头文件:#include <linux/rtc.h> 

    例子如下:

    展开全文
  • linux内核获取当前系统时间

    千次阅读 2018-10-28 17:38:12
    获取linux内核的系统时间操作方法网上有,大多千篇一律,照着网上的做法,就会产生错误,首先是获取linux内核的系统时间: 参考: http://lhsblog01.blog.163.com/blog/static/10200451920101192410981/ 在这样一...

    获取linux内核的系统时间操作方法网上有,大多千篇一律,照着网上的做法,就会产生错误,首先是获取linux内核的系统时间:

    参考:

    http://lhsblog01.blog.163.com/blog/static/10200451920101192410981/

    在这样一段代码中,会产生一个问题获取到的时间与本地时间始终相差8个小时,解决办法查询好久,终于找到了解决办法,究其原因,是硬件时间使用的标准时间,但是date使用的是本地时间,造成这样的原因可能是由于配置文件的损坏造成的。

     

     

    CentOS7解决方法:

    timedatectl set-local-rtc 1

    参考:https://blog.csdn.net/robertsong2004/article/details/42268701

    https://blog.csdn.net/yin138/article/details/52765089

     

     

    展开全文
  • Linux内核时间获取

    千次阅读 2015-05-25 15:55:36
    内核一般通过jiffies值来获取当前时间。尽管该数值表示的是自上次系统启动到当前的时间间隔,但因为驱动程序的生命期只限于系统的运行期 (uptime),所以也是可行的。驱动程序利用jiffies的当前值来计算不同事件间的...
    内核一般通过jiffies值来获取当前时间。尽管该数值表示的是自上次系统启动到当前的时间间隔,但因为驱动程序的生命期只限于系统的运行期 (uptime),所以也是可行的。驱动程序利用jiffies的当前值来计算不同事件间的时间间隔。 硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),每一个周期称作一个tick(节拍)。Linux内核从2.5版内核开始把频率从100调高到1000(当然带来了很多优点,
    也有一些缺点)。jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数。譬如,如果计算系统运行了多长时间,可以用 jiffies/tick rate 来计算。

    jiffies定义在文件<linux/jiffies.h> 

    如果您需要更精确的时间来测量或者记录某些事情的话,内核中有个xtime全局变量,类型是struct timespec {time_t tv_sec; long tv_nsec;}按照这个数据结构,它是ns级的。

    而且还有一个current_kernel_time函数,通过它就可以获取xtime的值。但是xtime是在时钟中断里更新的,而一个tick往往是 10ms或者100ms,它只能保证在时钟中断ISR调用时刻,它返回的值是精确到ns级,并不能保证任何一个调用这个函数的时刻都能这样,原因是xtime的更新速度比它差几个数量级。

    如果需要精确到微妙级别,可以使用do_gettimeofday函数。该函数并不返回今天是本周的星期几或类似的信息;它是用微秒值来填充一个指向struct timeval的指针变量。相应的原型如下:

    #include <linux/time.h>

    void do_gettimeofday(struct timeval *tv);

    源码中声明的do_gettimeofday在Alpha和Sparc之外的体系结构上有“接近微秒级的分辨率” ,在Alpha和Sparc上和jiffies值的分辨率一样。Sparc的移植版本在2.1.34版的内核中升级了,可以支持更细粒度的时间度量。

    void do_gettimeofday(struct timeval *tv)
    {
     unsigned long flags;
     unsigned long seq;
     unsigned long nsec, sec, lost;

     do {
      seq = read_seqbegin_irqsave(&xtime_lock, flags);
      usec = system_timer->offset();

      lost = jiffies - wall_jiffies;
      if (lost)
      usec += lost * USECS_PER_JIFFY;

      sec = xtime.tv_sec;
      nsec += xtime.tv_nsec;
     } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));

     /* usec may have gone up a lot: be safe */
     while (nsec >= 1000000000) {
      nsec -= 1000000000;
      sec++;
     }

     tv->tv_sec = sec;
     tv->tv_usec = usec;
    }


    中可以发现,我们只要稍微的修改一下代码就可以达到纳秒的精确度了

    void do_gettimeofday_nsec(struct timespec *tv)
    {
     unsigned long flags;
     unsigned long seq;
     unsigned long usec, sec, lost;

     do {
      seq = read_seqbegin_irqsave(&xtime_lock, flags);
      usec = system_timer->offset();

      lost = jiffies - wall_jiffies;
      if (lost)
      usec += lost * USECS_PER_JIFFY;

      sec = xtime.tv_sec;
      usec += xtime.tv_nsec / 1000;
     } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));

     /* usec may have gone up a lot: be safe */
     while (usec >= 1000000) {
      usec -= 1000000;
      sec++;
     }

     tv->tv_sec = sec;
     tv->tv_usec = usec;
    }

    注意这里使用了不同的时间结构。



    获得时间

    内核通过xtime变量保存墙上时间,该变量是timespec类型的,在linux/time.h中定义如下:

    1       struct timespec {

    2           __kernel_time_t tv_sec;                

    3           long tv_nsec;               

    4        };

    其中,tv_sec是以秒为单位时间,它保存着从1970年7月1日以来经过的时间,而tv_nsec记录自上一秒开始经过的纳秒数。

    在最新的内核中,xtime未导出因此不能在内核模块中使用。不过内核提供了内核函数current_kernel_time()来获取当前时间,该函数返回timespec类型的时间。


    展开全文
  • Linux | 为什么用户态和内核态的切换耗费时间

    千次阅读 多人点赞 2019-04-01 13:41:16
    经过编译,synchronized标注的函数会加一个读写锁,一般不推荐使用,因为加锁解锁设计到内核态与用户态的转换,有时转化耗时比函数体执行时间还长,所以不推荐使用。 这个观点在学操作系统的时候作为常识被认知,那...
  • ubuntu16.04 查看内核,升级内核,删除内核,切换内核 1:查看内核列表 sudo dpkg --get-selections |grep linux-image linux-image-4.4.0-21-generic install linux-image-4.4.0-66-generic deinstall ...
  • linux内核编译步骤

    千次阅读 2021-05-13 00:47:31
    linux内核编译步骤对于linux新手来说,编译内核相对有一些难度,甚至不知道如何入手,我通过在网上收集这方面的资料,最终编译成功.现在我归纳了一下,写出这一篇还算比较详细的步骤,希望能对各位新手有一些帮助。1...
  • From: 全面解析Linux 内核 3.10.x - 进程调度 伟大的国家之所以伟大,那是因为一切都井然有序。何谓调度?调度算法作为内核的几大核心之一,其重要程度可见一斑。 一个形象的比喻是,硬件好比一个国家拥有的资源(水...
  • Linux内核中的时间函数

    千次阅读 2019-08-05 16:52:08
    ktime时间函数 基于ktime_t格式的时间 ktime_t ktime_get(void); 获取基于CLOCK_MONOTONIC的当前时间,返回ktime_t格式的数据类型。 ktime_t ktime_get_boottime(void); 获取基于CLOCK_BOOTTIME的当前时间,返回...
  • linux内核计算时间差以及jiffies溢出

    千次阅读 2014-06-01 00:42:52
    linux内核
  • Linux内核启动显示时间信息

    千次阅读 2017-05-13 16:31:02
    它在打印内核启动信息之前都会先打印一个时间信息出来! 下面来看看怎么配置Linux内核: 首先在Linux内核文件下,执行make menuconfig 命令,进入配置界面。 点击Kernel hacking选项,选择Show timing
  • Linux内核中获取当前时间

    万次阅读 2011-06-17 21:10:00
    7.2. 获知当前时间内核代码能一直获取一个当前时间的表示, 通过查看 jifies 的值. 常常地, 这个值只代表从最后一次启动以来的时间, 这个事实对驱动来说无关, 因为它的生命周期受限于系统的 uptime. 如所示, 驱动...
  • Linux内核发布时间

    千次阅读 2017-12-14 14:13:15
    有了这个Linux内核版本发布时间表(0.00到3.19,当然没有包含全部的版本),大家就可以看看自己用的版本是何时发布的了!做内核维护查看相关patch log时大致做个参考。 版本号 时间 发展史 0.001991.2-4两个进程分别...
  • 说说微内核与宏内核

    千次阅读 2021-05-11 14:10:09
    内核的概念与宏内核的概念是相互对立的。宏内核,一般是将系统的主要核心组件全部在内核实现。例如,内存管理器、进程管理器和I/O管理器等。可以想象,这样设计的内核各组件之间的关联很大,也就是常说的耦合性很...
  • 有了这个Linux内核版本发布时间表(0.00到3.19,当然没有包含全部的版本), 大家就可以看看自己用的版本是何时发布的了!做内核维护查看相关patch log时大致做个参考。 版本号 时间 发展史 0.00 1991....
  • 内核和微内核介绍

    千次阅读 2019-08-28 18:47:44
    内核和微内核的基本概念 宏内核:简单来说,就是把很多东西都集成进内核,例如linux内核,除了最基本的进程、线程管理、内存管理外,文件系统,驱动,网络协议等等都在内核里面。将内核从整体上作为一个大过程...
  • Linux内核定时器

    千次阅读 2019-05-23 20:21:48
    时间系统的工作需要软硬件以及操作系统的互相协作,在上一部分,我们已经看到大多数时间函数都依赖内核系统调用,GlibC 仅仅做了一次请求的转发。因此必须深入内核代码以便了解更多的细节。 内核自身的正常运行也...
  • 操作系统大内核和微内核The Kernel is the core part of a computer, smartphone operating system. The kernel operates in the lowest layer according to the operating system architecture which is ...
  • linux内核驱动 获取精确时间 计时

    千次阅读 2018-06-14 12:03:33
    程序代码: struct timespec ts; ts = current_kernel_time(); printk(KERN_ALERT "%ld %ld\n", ts.tv_sec, ts.tv_nsec);... /*获取时间*/ do_gettimeofday(&amp;tv); printk(KERN_...
  • 本文是由字节跳动系统部 STE 团队出品的“kernel trace tools”系列文章之一,以介绍团队自研多类延迟问题追踪工具。在实际工作中,会遇到由于内核态不调度而引发的高网络延迟...
  • 一文看懂Linux内核!Linux内核架构和工作原理详解

    千次阅读 多人点赞 2021-01-29 15:14:27
    linux内核相关视频解析: 5个方面分析linux内核架构,让你对内核不再陌生 90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc的原理 手把手带你实现一个Linux内核文件系统 简介 作用是将应用层序的请求传递...
  • 用户态和内核态的切换耗费时间的原因 总的来说,就是线程切换或者加锁解锁都是因为需要用户态和内核态的切换,从而导致的开销大。 应用程序的执行需要依托内核提供的资源,包括CPU、存储、IO等,因此内核提供了一个...
  • debian的成功升级内核

    千次阅读 2021-05-10 18:19:40
    先配置好 /etc/apt/sources.list然后命令:apt-get updateapt-cache search kernel-image-2.6#这个命令是搜索 2.6 版本的 kernel-image#然后你就会找到所有内核的一个列表,有很多。#你挑一个自己想要的,比如 ...
  • 应该说是把linux内核这部分知识提前了,因为坐公交需要点视频来打发一下时间,感觉linux内核的视频就不错,就顺便把linux内核提前了。这一次也是打算视频和书一起看,然后总结。书的话还是推荐《深入linux内核架构》...
  • 操作系统微内核架构研究

    千次阅读 2020-11-18 17:02:46
    内核是操作系统内核的一种,在工控系统...本文较为全面地研究了微内核技术的各个方面,包括微内核的定义、微内核的体系架构、微内核的发展历史、微内核的特点、微内核的应用场景,以及麒麟软件所进行的部分研究工作。
  • Linux内核版本发布时间整理

    千次阅读 2015-05-30 23:39:49
    有了这个Linux内核版本发布时间表(0.00到3.19,当然没有包含全部的版本), 大家就可以看看自己用的版本是何时发布的了! 或许有同学会大吃一惊,哇(⊙0⊙)我用的版本10年前就有了啊! 发展史我也没写全,有时间和...
  • Ubuntu中linux配置内核流程

    千次阅读 2021-11-12 12:03:42
    文章目录一、实验环境二、下载内核三、安装环境需要的依赖包四、编译前的配置工作五、编译内核六、安装内核七、启用新内核 一、实验环境 VMware Workstation Player Ubuntu      //我用的是 Ubuntu 21.10 内核...
  • Linux centos7升级内核(两种方法:内核编译和yum更新) Linux的内核概念不用说大家也很清楚,正是内核版本的不同,才有Linux发行版本的说法,现在主流的centos应该都是centos7了,从centos7.2开始,内核版本为3.10...
  • Linux 内核版本和发布历史

    千次阅读 2021-01-28 17:45:36
    Linux 内核最早是由林纳斯·托瓦兹1991年为自己个人电脑开发的,他当时在 Usenet 新闻组 comp.os.minix 登载帖子,这份著名的帖子标志着 Linux 内核计划的正式开始。 在 Linux 系统中,在/proc/version文件中可查看...
  • Linux内核调优

    千次阅读 2020-03-15 16:58:28
    文章目录一、优化文件打开数和打开系统进程数1、打开文件最大数临时设置方法:2、文件描述符二、TCP的三次握手和四次断开三、内核参数优化1、BAT企业生产环境内核完整参数:2、Linux内核常见参数详解3、Linux内核...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 645,774
精华内容 258,309
关键字:

内核时间