linux内核锁死怎么解决_解决Linux内核中的2038年问题
linux内核锁死怎么解决 由于时间在Linux中的表示方式,带符号的32位数字无法支持20:38(UTC)3:14:07之后的时间。 2038年 (Y2038或Y2K38)问题是关于时间数据类型表示的。 解决方案是使用64位时间戳。我在内核开发人员Arnd Bergmann担任Outreachy实习生时就开始研究该问题。 Outreachy是一个仁慈的程序,可以帮助新程序员进入开源开发。...
linux内核锁死怎么解决
由于时间在Linux中的表示方式,带符号的32位数字无法支持20:38(UTC)3:14:07之后的时间。 2038年 (Y2038或Y2K38)问题是关于时间数据类型表示的。 解决方案是使用64位时间戳。
我在内核开发人员Arnd Bergmann担任Outreachy实习生时就开始研究该问题。 Outreachy是一个仁慈的程序,可以帮助新程序员进入开源开发。 内核项目的导师通常是经验丰富的内核开发人员,例如Arnd。
我选择解决Y2038问题,因为它使我可以接触内核中的所有子系统,甚至更多。 该问题还涉及用户空间,C库,POSIX和C标准。 我发现问题实际上与层之间的接口有关。
我们解决的领域之一是虚拟文件系统(VFS)。 VFS是文件系统抽象层。 因此,即使某些文件系统(例如ext4)可以在32位系统上表示2038年以后的时间戳,但是如果没有VFS层的支持,它们也无法做到。
对VFS的更改是获得共识和合并所需时间最长的修补程序系列之一。
提出解决方案
问题: inode时间戳的内核内表示在struct timespec中 ,这不是Y2038安全的。 建议的解决方案:将表示形式更改为struct timespec64 ,这是Y2038安全的。
该系列的第一个版本由Arnd在2014年发布 。 当时,存在一些未解决的问题,以及有关添加时间戳范围检查的一些反馈。
2016年1月,我发布了第一个对此的评论请求(RFC),询问是否对上述方法有任何反对意见。 这不是内核社区的典型RFC。 系列求职信解释了拟议的变更,并提供了一些有关如何进行变更的示例。 关于我们在本系列中试图传达的内容有些困惑。
我发布了另一个系列(实际上是三个系列),以三种不同的方式解决该问题。 这是早期系列的精简版本,仅解决了核心问题。 这也是非典型的。 内核开发人员Thomas Gleixner说,他稍微偏爱一种解决问题的方法,因此我们以这种方式完成了所有补丁。
但是我们必须摆脱一些旧的接口才能进行更改。 当我发布一系列此类内容时,Linus Torvalds 不喜欢其中一个接口( current_fs_time(sb) ),因为它将超级块作为访问时间戳粒度的参数。 但是时间戳实际上是索引节点的功能,而不是超级块的功能。 因此,我们摆脱了这个API。
现在必须重新制作原始系列。 卖旗日补丁似乎是解决问题的蛮力方法。 但是我们最终只是这样做了。 通过使用Coccinelle脚本,我们甚至更进一步。 这更改了80多个文件。 面临的挑战是使更改变得基本,以避免退化。 我们终于在2018年6月最终合并了补丁程序 ,并且没有听说此更改有任何退步。
在整个练习结束时,我们摆脱了三个内核API,重新安排了一些文件系统时间戳处理,处理了打印格式以支持更大的时间戳,分析了32位体系结构对象转储,并重写了至少五个版本从零开始的系列。 这只是我们为内核解决的问题之一。 但是Y2038一直是我最喜欢的项目之一。
迪帕Dinamani将提出如何防止时间用尽的追求使我对Linux内核的各个角落 ,在linux.conf.au ,1月21日至25日在新西兰基督城。
翻译自: https://opensource.com/article/19/1/year2038-problem-linux-kernel
linux内核锁死怎么解决

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)