/*
 *  linux/kernel/mktime.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 */

#include <linux/mktime.h>

/*
 * This isn't the library routine, it is only used in the kernel.
 * as such, we don't care about years<1970 etc, but assume everything
 * is ok. Similarly, TZ etc is happily ignored. We just do everything
 * as easily as possible. Let's find something public for the library
 * routines (although I think minix times is public).
 */
/*
 * PS. I hate whoever though up the year 1970 - couldn't they have gotten
 * a leap-year instead? I also hate Gregorius, pope or no. I'm grumpy.
 */
#define MINUTE 60                     //1分钟60秒
#define HOUR (60*MINUTE)              //一小时 60 * MINUTE秒
#define DAY (24*HOUR)                 //一天有多少秒
#define YEAR (365*DAY)                //一年有多少秒

/* interestingly, we assume leap-years */
//假设为闰年,计算每个月过去秒数
static int month[12] = {
    0,                                     //进入新的一年过去的秒数
    DAY*(31),                              //一月过去之后占用的秒数
    DAY*(31+29),                           //二月过去之后占用的秒数
    DAY*(31+29+31),                        //三月过去之后占用的秒数
    DAY*(31+29+31+30),                     //四月过去之后占用的秒数
    DAY*(31+29+31+30+31),                  //五月过去之后占用的秒数
    DAY*(31+29+31+30+31+30),               //六月过去之后占用的秒数
    DAY*(31+29+31+30+31+30+31),            //七月过去之后占用的秒数
    DAY*(31+29+31+30+31+30+31+31),         //八月过去之后占用的秒数
    DAY*(31+29+31+30+31+30+31+31+30),      //九月过去之后占用的秒数
    DAY*(31+29+31+30+31+30+31+31+30+31),   //十月过去之后占用的秒数
    DAY*(31+29+31+30+31+30+31+31+30+31+30) //十一月过去之后占用的秒数(12月过去要计算整年)
};
//初始化内核时间
long kernel_mktime(struct mktime * time)
{
    long res;
    int year;

year = time->year - 70;   //从1970年一月0点0分0秒
/* magic offsets (y+1) needed to get leapyears right.*/
    res = YEAR*year + DAY*((year+1)/4); //从计时时间开始到今年共有多少秒
    res += month[time->mon];            //加上已经过去的月份的秒数(假设为闰年)
/* and (y+2) here. If it wasn't a leap-year, we have to adjust */
    if (time->mon>1 && ((year+2)%4))    //判断是否为闰年,并且是否过了二月,进行时间调整
        res -= DAY;
    res += DAY*(time->day-1);           //加上这个月过去的天数所占有的秒数
    res += HOUR*time->hour;             //加上过去的小时数占有的秒数
    res += MINUTE*time->min;            //加上过去的分钟数占有的秒数
    res += time->sec;                   //加上过去的秒数
    return res;                         //结果为计时开始到现在为止过去的秒数
}

kernel/mktime的更多相关文章

  1. Linux0.11内核剖析--内核代码(kernel)--sched.c

    1.概述 linux/kernel/目录下共包括 10 个 C 语言文件和 2 个汇编语言文件以及一个 kernel 下编译文件的管理配置文件 Makefile.其中三个子目录中代码注释的将放在后面的 ...

  2. 《linux 内核全然剖析》 mktime.c

    tm结构体的定义在time.h里面 struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_y ...

  3. kernel/Makefile

    ## Makefile for the linux kernel.## Note! Dependencies are done automagically by 'make dep', which a ...

  4. Linux 内核概述 - Linux Kernel

    Linux 内核学习笔记整理. Unix unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠. 1973 年,在用 ...

  5. 04.ubuntu下kvm 命令行安装64位ubuntu报"Couldn't find hvm kernel for Ubuntu tree."的问题

    1.安装ubuntu时使用的virt-install的配置: virt-install \ --name test4 \ --ram 1024 \ --disk path=/data/01_ubunt ...

  6. 在 kernel 下打 log。 怪異現象與解決方式。

    code battery_log(BAT_LOG_CRTI, "y t: %d \n", (int)my_timer_timeout); battery_log(BAT_LOG_C ...

  7. 机器学习——支持向量机(SVM)之核函数(kernel)

    对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...

  8. User space 与 Kernel space

    学习 Linux 时,经常可以看到两个词:User space(用户空间)和 Kernel space(内核空间). 简单说,Kernel space 是 Linux 内核的运行空间,User spa ...

  9. kernel 4.4.12 外部模块Makefile 脚本编写

    kernel 4.4.12 最简单module的编译 上一篇博客上面有一个最简单的模块源代码,今天就上一个Makefile,运行make 就可以编译一个外部的模块. vim Makefile 这个是我 ...

随机推荐

  1. C++ 11 lambda

    转载:http://www.cnblogs.com/kedebug/p/3224561.html lambda 表达式的简单语法如下:[capture] (parameters) -> retu ...

  2. Spring IOC 依赖注入的两种方式XML和注解

    依赖注入的原理 依赖注入的方式---XML配置 依赖注入的方式---注解的方式 Spring 它的核心就是IOC和AOP.而IOC中实现Bean注入的实现方式之一就是DI(依赖注入). 一 DI的原理 ...

  3. 初学者的python学习笔记2

    本来想是先把作业二搞定的,结果发现作业二用的字典,一脸懵逼,还是先搞定第二课吧.其实第二课和第一课内容差不多,据说是第一课的老师去美国了……不管怎么样先整理一下吧. ----------------- ...

  4. [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys

    错误原因在于出现相同内容. 原写为: <li ng-repeat="log in logs" scroll-down> {{log}}</li> 改写为: ...

  5. 如何在MainWindowViewModel中引用MainWindow.xaml中的Resource?

    问题描述:在MainWindow.xaml的Window.Resource中定义了一个资源,如下: <xctk:Wizard x:Key="_wizard" FinishBu ...

  6. 4.3.5 使用Http:// (Https://)协议连接到ActiveMQ 2015年9月28日

    用到的几点地方: 1.服务器端 ActiveMQ的文件activemq.xml中,预先要定义好有关本协议http的传输连接器格式,抓图如下: 2.    然后,开启Eclipse环境,在publish ...

  7. python的各种编辑器-PyScripter、pycharm 、atom、vscode、Sublime Text等等

    RT,本文主要列举python的各种编辑器-PyScripter.pycharm .atom.vscode.Sublime Text等等. PyScripter 开源 免费 windows only ...

  8. php 读取网页源码 , 导出成txt文件, 读取xls,读取文件夹下的所有文件的文件名

    <?php // 读取网页源码$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLO ...

  9. NLPIR(ICTCLAS)分析包的使用记录

    前段时间使用了HanLP一个纯JAVA分词工具包,后来老大说分词效果不是很好,需要换一个分词工具.于是推荐了一个分词工具——NLPIR,它是中科院XXX研发的一个分词工具.这个分词工具只用C/C++写 ...

  10. Hive的内表和外表以及分区表

    1. 内表和外表的区别 内表和外表之间是通过关键字EXTERNAL来区分.删除表时: 内表:在删除时,既删除内表的元数据,也删除内表的数据 外表:删除时,仅仅删除外表的元数据. CREATE [EXT ...