新十年伊始,Linux Kernel 5.6 的开发者已经准备好着手解决将在下一个十年到来的 2038 年问题(又称 “Y2038” 或 “Unix Y2K” 问题)。Linux 5.6 也成为第一个为 32 位系统准备运行到 2038 年之后的主线内核。
2038 年问题与千年虫问题类似,它可能会导致某些软件在 2038 年 1 月 19 日 3 时 14 分 07 秒之后无法正常工作。届时,在大部分 32 位操作系统上,依据 “time_t” 标准,时间将会“绕回”且在内部被表示为一个负数,并造成程序无法工作,因为它们无法识别 2038 年,而可能会跳回 1970 年或 1901 年。
现阶段,还没有针对 2038 年问题的通用解决方案。Linux 5.6 已率先做好准备,并极有可能反向移植到 5.4/5.5 稳定分支。
在 Linux 开发人员 Arnd Bergmann 寄给 Linus Torvalds 的邮件中,他提到,Linux Kernel 5.6 应该作为基础,使 32 位系统能够运行到 2038 年以后。他提出的 PR 包括对 time_t 的更改,即更改存储秒数(带符号的 32 位整数)。
Bergmann 表示,“我再次遍历了 time_t 的所有用户,以确保内核处于长期可维护的状态,用安全的替代方法替换了对 time_t 的所有剩余引用。该系列的一些相关部分被引入 nfsd,xfs,alsa 和 v4l2 树中。在 linux-mm 的五个分支全部合并之后,linux-mm 中的最后一组补丁将删除当前未使用的 time_t / timeval / timespec 类型和辅助函数,以确保没有新用户被合并。”
由于 2038 年问题,Unix 时间戳将在 2038 年 1 月 19 日溢出,因为它无法存储带符号的 32 位整数,并且将限制更新 32 位系统。为了避免这一问题,根据 Bergmann 的说法,用户空间应用程序需要使用现代 Linux 内核系统调用,并且需要使用 GNU C Library 2.32 和 Musl libc 1.2 针对 64 位 time_t 构建用户空间。
最后,他还提到,64 位计算机上出现的所有 y2038 问题也适用于 32 位计算机。
消息来源:fossbytes
转自 https://www.oschina.net/news/113086/linux-5-6-32-bit-past-y2038