Linux0.11 源码趣读
闪客
低并发编程公号作者
18650 人已学习
赠一得一
课程目录
已完结/共 22 讲
Linux0.11 源码趣读
15
15
1.0x
00:00/00:00
登录|注册

16 | 时间初始化time_init:操作系统怎么获取当前时间?

你好,我是闪客。
上一讲咱们说到,通过初始化控制台的 tty_init 操作,内核代码已经可以很方便地在控制台输出字符啦!
用户也可以通过敲击键盘,或调用诸如 printf 这样的库函数,在屏幕上输出信息,或使用换行和滚屏等功能。这些都得益于 tty_init 这个初始化方法和它对外封装的小功能函数在底层的支撑。

时间初始化 time_init

我们继续看下一个初始化的倒霉鬼,time_init
// init/main.c
void main(void) {
...
time_init();
...
}
曾经我很好奇,操作系统是怎么获取到当前时间的呢
当然,现在都联网了,它可以从网络上实时同步时间。但没有网络时,为什么操作系统启动之后可以显示出当前的时间呢?难道操作系统在电脑关机后,依然不停地在某处运行着,勤勤恳恳地数着秒表么?
当然不是,我们今天就打开这个 time_init 函数一探究竟。
打开这个函数后我又是很开心,因为它很短,且没有更深入的方法调用。
// init/main.c
#define CMOS_READ(addr) ({ \
outb_p(0x80|addr,0x70); \
inb_p(0x71); \
})
#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
static void time_init(void) {
struct tm time;
do {
time.tm_sec = CMOS_READ(0);
time.tm_min = CMOS_READ(2);
time.tm_hour = CMOS_READ(4);
time.tm_mday = CMOS_READ(7);
time.tm_mon = CMOS_READ(8);
time.tm_year = CMOS_READ(9);
} while (time.tm_sec != CMOS_READ(0));
BCD_TO_BIN(time.tm_sec);
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);
time.tm_mon--;
startup_time = kernel_mktime(&time);
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了操作系统中时间初始化time_init的过程,通过与CMOS端口进行读写交互,获取年月日时分秒等数据,并计算出开机时间startup_time变量。文章通过解释CMOS_READ和BCD_TO_BIN的实现方式,展示了操作系统与外设交互的基本玩法。作者强调了操作系统设计的繁琐性,需要读取硬件手册获取信息并进行设置。总结来看,本文突出了操作系统中与外设交互的重要性,展示了操作系统设计的基础知识。

该试读文章来自《Linux0.11 源码趣读》,如需阅读全部文章,
请先通过赠一得一解锁课程
赠一得一
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • IT蜗壳-Tango
    打卡留念
    2023-02-15归属地:江苏
    1
  • Y~龙。!
    精彩
    2023-08-06归属地:广东
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部