Linux驱动 | Linux内核 RTC时间架构
内容提要
本文深入解析了Linux内核时间子系统及驱动移植,包括系统时间和RTC时间的区别,获取系统时间和RTC时间的方法,RTC时间框架的结构和驱动注册过程,硬件抽象层interface.c的实现,RTC在sysfs文件系统和proc文件系统中的呈现,瑞芯微对RTC时间的同步和文件权限的控制。
延伸解读
系统时间与RTC时间的本质区别
系统墙钟时间由Linux内核维护,通过date命令查看和设置,完全运行在内存中,掉电即失。RTC时间来自主板上的RTC芯片,由纽扣电池供电,即使系统关机也能持续计时。系统启动时,内核通过hctosys机制从RTC读取时间并写入系统时间,这就是设备关机重启后仍能显示正确时间的原因。理解这一区别,有助于在调试时间异常时快速定位是系统时间被篡改还是RTC芯片本身走时不准。
RTC驱动移植的核心:填充rtc_class_ops
RTC驱动开发的主要工作是实现rtc_class_ops结构体中的回调函数,如read_time、set_time、read_alarm、set_alarm等,然后调用devm_rtc_device_register注册。注册成功后,内核会创建rtc_device对象,并在/dev/下生成rtcN设备节点,同时通过sysfs和proc暴露接口。以hym8563为例,注册日志会显示I2C通道和从设备地址,以及最终生成的rtc0设备名。移植时需确保回调函数正确操作硬件寄存器,否则时间读写会失败。
RTC在sysfs与proc中的用户空间接口
RTC设备在sysfs中以/sys/class/rtc/rtc0形式呈现,包含date、time、since_epoch、hctosys等属性文件,其中hctosys的值决定系统启动时是否将RTC时间同步到系统时间。proc文件系统则提供/proc/driver/rtc,展示当前RTC时间、闹钟状态和中断使能信息。瑞芯微平台上的安卓程序正是通过操作/sys/class/rtc/rtc0下的节点以及/dev/rtc0来管理时间,因此这些文件的访问权限必须正确配置,否则会导致时间设置失败。
瑞芯微平台的时间同步与权限控制
瑞芯微系统上电后,安卓的AlarmManagerService会读取/sys/class/rtc/rtc0/hctosys的值,若为1则允许将RTC时间写入系统墙钟时间。设置时间时,安卓层通过ioctl向/dev/rtc0发送RTC_SET_TIME命令。由于涉及系统时间修改,相关文件节点需要严格的访问权限控制,瑞芯微通过sepolicy中的genfs_contexts文件为/sys/class/rtc/下的节点分配合适的安全上下文,开发者若遇到权限拒绝,应检查该文件配置。
Q&A
Linux系统时间和RTC时间有什么区别?
Linux系统时间由操作系统管理,而RTC时间来自设备上的RTC芯片。
如何在Linux中查看和设置系统时间?
可以使用date命令查看和设置当前的系统时间。
RTC时间框架的主要组成部分有哪些?
RTC时间框架包括硬件、驱动、class.c、interface.c、rtc-lib.c和rtc-dev.c等文件。
如何通过hwclock命令读取RTC时间?
可以使用hwclock命令来读取设备上的RTC芯片时间。
RTC在sysfs文件系统中是如何呈现的?
RTC在sysfs文件系统中以符号链接的形式呈现,设备属性可通过/sys/class/rtc访问。
瑞芯微如何实现RTC时间的同步和文件权限控制?
瑞芯微通过/sys/class/rtc/rtc0下的文件节点实现时间管理,文件权限控制由特定的sepolicy文件提供。