聊聊Linux2038年问题

从Unix创世纪说起

创世纪一词来自于希伯来语:意为“在开始之时”。每种文化都有它的创世纪一说,比如《创世纪》便是《圣纪》的第一卷,讲述了神创造,撒但败坏,人堕落,耶和华应许拯救的思想和故事。

对于Unix或类Unix系统,它关心时间从哪里开始,这便是它的创世纪。关于Unix和C语言创立背后的故事,我们在这里不重点介绍。

Unix操作系统的创世纪可以从中文Wikipedia(或英文wikipedia)中找到:

UNIX,一种计算机操作系统,具有多任务、多用户的特征。于1969年,在美国AT&T公司的贝尔实验室开发出来,参与开发的人有肯·汤普逊、丹尼斯·里奇等。
目前它的商标权由国际开放标准组织所拥有,只有匹配单一UNIX规范的UNIX系统才能使用UNIX这个名称,否则只能称为类UNIX(UNIX-like)。

Wikipedia中的图片更直观说明了整个Unix的发展和繁衍

原来整个系统中原来32位的所有系统调用都保留下来。新增一个类型,与之相关的系统调用都提供一套新的64位系统调用ABI。

老用户态程序由于在之前已经编译老了,在新系统运行时,它执行的系统调用依然还是原来老的32位系统调用。 而新编译的应用程序,尽管在源代码层面上看到还是time_t类型,但是在新系统上,它已变成64位了,编译出来的二进制程,它实际上调用的函数者是64位的系统调用。

其实在Linux时间相关的函数中,不单单只有一个类型,还有等等。所有这些类型,都需要提供64位的定义。

时间相关的系统调用其实也一大堆,比如直接为时间操作函数(gettimeofday/settimeofday/adjtimex/clock_gettime/clock_settime/clock_adjtime/clock_nanosleep),也有文件操作相关的函数也带上时间属性(stat/lstat/fstatat),同样还有些大杂烩函数诸如ioctl很多命令字出现时间相关的参数,都需要实现64位的版本。

当前Linux 区进展

正如前面所说,当前离2038时间还有20+年,Linux 区最近几年才慢慢开始着手解决2038年问题。

linux kernel newbies专项门有个2038年项目来跟踪此问题。整个项目有分成以下几部分:

  1. 用户态glibc对64位新型以及相应函数的支持
  2. 内核态对64位新型以及系统调用实现的支持
  3. 文件系统解决2038年问题

上面3个部分之中,第2点是重为重要的,也是整个解决方案的基石所在。当前 Arnd Bergmann 正着手解决提出第2部分,可以从他的git看到他的解决方案。至文件系统部分,一直都有人有解决,但解决时间还有待进一步了解。

glibc部分支持必须要等内核的解决方案经过评审完成并合入到内核主线之后,glibc 区才能根据最终敲定的ABI来实现64位time_t和相关函数。

总结

2038年问题与之前的千年虫问题的杀伤力是不一样的,千年虫属于应用程序的问题,而2038年问题却是系统级的,有更大的杀伤力。幸好当前离2038还有20年时间,并且整个Linux 区已经开始解决的,离目标不远了,曙光在望。

文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24718 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年9月1日
下一篇 2016年9月2日

相关推荐