Linux驱动 | Linux内核 RTC时间架构
内容提要
本文介绍了Linux内核的时间子系统,包括系统时间和RTC时间的区别,以及RTC时间框架的结构和驱动注册过程。同时讨论了WT时间和RTC时间的同步问题。
延伸解读
系统时间与RTC时间的本质区别
系统时间由Linux内核维护,通过date命令查看,但掉电后丢失;RTC时间由硬件芯片(如hym8563)维护,通过hwclock命令读取,依靠纽扣电池在关机后继续计时。两者独立运行,系统启动时通过hctosys机制将RTC时间同步到系统时间,确保时间连续性。理解这一区别有助于排查时间跳变或不准的问题。
RTC驱动注册的关键步骤
RTC驱动开发的核心是填充rtc_class_ops结构体,实现read_time、set_time等回调,然后调用devm_rtc_device_register注册。注册过程中,内核会分配rtc_device、创建/dev/rtcN字符设备节点,并在sysfs和proc中生成对应接口。驱动加载成功后,应用层即可通过open/read/ioctl操作RTC设备。
sysfs与proc中的RTC接口
在sysfs中,RTC设备以符号链接形式出现在/sys/class/rtc/rtc0,链接到具体I2C总线下的设备路径,并暴露date、time、since_epoch、wakealarm等属性文件。proc文件系统则提供/proc/driver/rtc,显示当前时间、闹钟状态和中断使能信息。这些接口为应用层提供了统一的时间管理入口。
时间同步机制与权限注意
系统上电后,内核通过late_initcall调用rtc_hctosys,从RTC读取时间并设置系统时钟。瑞芯微平台中,安卓的AlarmManagerService会读取/sys/class/rtc/rtc0/hctosys的值决定是否同步,并通过ioctl设置RTC。需注意/sys/class/rtc/下文件的访问权限,瑞芯微通过sepolicy中的genfs_contexts文件进行控制,配置不当可能导致时间设置失败。
Q&A
Linux内核的时间子系统包括哪些部分?
Linux内核的时间子系统包括系统时间和RTC时间。
如何查看Linux系统时间和RTC时间?
可以通过命令'date'查看系统时间,通过命令'hwclock'读取RTC时间。
RTC时间框架的主要组成部分是什么?
RTC时间框架包括硬件、驱动、接口和设备节点等部分。
RTC驱动是如何注册的?
RTC驱动通过class.c文件注册,使用devm_rtc_device_register函数创建rtc设备。
WT时间和RTC时间是如何同步的?
WT时间通过从RTC读取时间来同步,系统启动后会将RTC时间设置为系统时间。
设备关机后RTC时间如何保持?
设备关机后RTC仍能保持时间,因为RTC有纽扣电池供电。