从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