Linux内核源码分析--系统时间初始化(kernel_mktime()函数)

本文深入剖析Linux内核中系统时间初始化的过程,特别是kernel_mktime函数。从CMOS读取时间,通过汇编操作进行数据交互。详细解释了时间计算中的关键步骤,包括对非润年、润年的处理,以及Y2K问题的讨论。此外,文章还探讨了可能存在的2100年问题。
摘要由CSDN通过智能技术生成

        从boot文件中的几个汇编程序执行后跳转到init文件中的main.c程序开始继续执行,该main.c函数式为系统运行的环境进行初始化的。首先来看系统时间的初始化(因为系统时间的初始化开始程序就在init文件中),其中主要还是由kernel中的mktime.c程序中的kernel_mktime函数计算时间的。

        先看下time_init(void)函数及相关结构是怎么实现的:

static void time_init(void)
{
	struct tm time;// 时间结构体在Linux/include/Time.h中有定义

	do {
		time.tm_sec = CMOS_READ(0); // 这句和下面几句是通过宏函数分别获取COMS中的秒、分、时、日、月、年
		time.tm_min = CMOS_READ(2); // CMOS_READ()宏函数见下面定义
		time.tm_hour = CMOS_READ(4);
		time.tm_mday = CMOS_READ(7);
		time.tm_mon = CMOS_READ(8);
		time.tm_year = CMOS_READ(9);
// 下面是:又获取一次秒数,检查和开始获取的是否一致,保证获取时间从秒到年之间最多相差1秒;
// 如果多于1秒,则会循环再次获取所有时间日期,直到获取时间差在1秒范围内;
} while (time.tm_sec != CMOS_READ(0));
          BCD_TO_BIN(time.tm_sec);// 由于CMOS中的系统时间是由BCD码记录的,所以获取数据后要把BCD码转换成二进制数
          BCD_TO_BIN(time.tm_min);
          BCD_TO_BIN(time.tm_hour);
          BCD_TO_BIN(time.tm_mday);
          BCD_TO_BIN(time.tm_mon);
          BCD_TO_BIN(time.tm_year);
// 记录的年份是从1~12(没人听说过有0月份或者大于12月份的),但是在函数中计算月份的时候是按照0~11来分别表示12个月的
// 比如 3月3日,其实只过去了2个月(1月和2月),计算时就用2表示。所以time.tm_mon--只是为了后面函数中好计算
   time.tm_mon--;
// startup_time表示从1970-01-01到开机时间为止过去了多少秒
	startup_time = kernel_mktime(&time);
}

        从CMOS读取系统时间,其实对于CMOS操作可以看我的另外一篇blog:http://blog.csdn.net/yuzhihui_no1/article/details/41869291,但具体来对CMOS操作还是比较简单的。因为某些芯片中有多个字节来表示对C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值