2.8 开机启动时间设置

2.8 开机启动时间设置

开机启动时间是大部分与时间相关的计算的基础。操作系统中一些程序的运算需要时间参数;很多事务的处理也都要用到时间,比如文件修改的时间、文件最近访问的时间、i节点自身的修改时间等。有了开机启动时间,其他时间就可据此推算出来。

具体执行步骤是:CMOS是主板上的一个小存储芯片,系统通过调用time_init()函数,先对它上面记录的时间数据进行采集,提取不同等级的时间要素,比如秒(time.tm_sec)、分(time.tm_min)、年(time.tm_year)等,然后对这些要素进行整合,并最终得出开机启动时间(startup_time)。

执行代码如下:

 
 
  1. //代码路径:init/main.c:  
  2. void main(void)  
  3. {  
  4.     …  
  5.     time_init();  
  6.     …  
  7. }  
  8.  
  9. #define CMOS_READ(addr) ({ \ //读CMOS实时时钟信息  
  10. outb_p(0x80|addr,0x70); \  //0x80|addr读CMOS地址,0x70写端口  
  11. inb_p(0x71); \   //0x71读端口  
  12. })  
  13.  
  14. #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)//十进制转二进制  
  15.  
  16. static void time_init(void)  
  17. {  
  18.     struct tm time;  
  19.  
  20.     do {  
  21.          time.tm_secCMOS_READ(0);//当前时间的秒值,以下类推  
  22.          time.tm_minCMOS_READ(2);  
  23.          time.tm_hourCMOS_READ(4);  
  24.          time.tm_mdayCMOS_READ(7);  
  25.          time.tm_monCMOS_READ(8);  
  26.          time.tm_yearCMOS_READ(9);  
  27.     } while (time.tm_sec != CMOS_READ(0));  
  28.     BCD_TO_BIN(time.tm_sec);  
  29.     BCD_TO_BIN(time.tm_min);  
  30.     BCD_TO_BIN(time.tm_hour);  
  31.     BCD_TO_BIN(time.tm_mday);  
  32.     BCD_TO_BIN(time.tm_mon);  
  33.     BCD_TO_BIN(time.tm_year);  
  34.     time.tm_mon--;  
  35.     startup_timekernel_mktime(&time); //开机时间,从1970年1月1日0时计算  
  36. }  
  37.  
  38. //代码路径:include\asm\io.h:  //嵌入汇编参看trap_init的注释  
  39. #define outb_p(value,port) \  //将value写到port  
  40. __asm__ ("outb %%al,%%dx\n" \   
  41.           "\tjmp 1f\n" \   //jmp到下面的第一个1:处,目的是延迟  
  42.           "1:\tjmp 1f\n" \    
  43.           "1:"::"a" (value),"d" (port))  
  44.  
  45. #define inb_p(port) ({ \  
  46. unsigned char _v; \  
  47. __asm__ volatile ("inb %%dx,%%al\n" \ // volatile,禁止编译器优化下列代码  
  48.                         "\tjmp 1f\n" \ //延迟  
  49.                         "1:\tjmp 1f\n" \  
  50.                         "1:":"=a" (_v):"d" (port)); \  
  51.                      _v; \  
  52.                      }) 

计算过程及开机启动时间在内存中的存储位置如图2-16所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值