Filesystems ext2/3/4文件系统如何处理64位时间?

Filesystems ext2/3/4文件系统如何处理64位时间?,filesystems,unix-timestamp,ext2,year2038,Filesystems,Unix Timestamp,Ext2,Year2038,我正在开发一个小型的ext2文件系统映像操作工具(比如列出目录,添加和提取文件而不需要挂载它)。 我刚刚遇到了Unix时间戳字段的问题。它们都是ext文件系统中的32位。正如我们所知,32位Unix时间戳在2038年之后将不再有效。大多数软件只需将时间的定义更改为64位,就可以轻松解决这个问题。但对于文件系统来说,这并不是那么容易。它们需要与现有的实现兼容,但也需要不时更新。ext文件系统究竟是如何做到这一点的?特别是像s_mtime,s_wtime,s_lastcheck,i_atime,i_

我正在开发一个小型的ext2文件系统映像操作工具(比如列出目录,添加和提取文件而不需要挂载它)。 我刚刚遇到了Unix时间戳字段的问题。它们都是ext文件系统中的32位。正如我们所知,32位Unix时间戳在2038年之后将不再有效。大多数软件只需将时间的定义更改为64位,就可以轻松解决这个问题。但对于文件系统来说,这并不是那么容易。它们需要与现有的实现兼容,但也需要不时更新。ext文件系统究竟是如何做到这一点的?特别是像
s_mtime
s_wtime
s_lastcheck
i_atime
i_mtime
i_mtime
i_dtime
这样的字段,如果你看一下,你会看到:

struct ext4_inode {
    ...
    __le32  i_ctime;    /* Inode Change time */
    ...
    __le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
    ...
};
如果你看一下用法,你会发现在内存中,使用了64位整数,分离只存在于磁盘上。

如果你看一下,你会看到:

struct ext4_inode {
    ...
    __le32  i_ctime;    /* Inode Change time */
    ...
    __le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
    ...
};

如果你看一下用法,你会发现在内存中,使用了64位整数,分离只存在于磁盘上。

所以基本上他们没有使用完整的64位整数(在磁盘上),而是在索引节点中使用34位表示秒,30位表示纳秒。超级块中的40位秒计数,没有纳秒。相当混乱,但可以完成工作(到2446年)。ext2和ext3似乎都是32位时间,所以基本上它们没有使用完整的64位整数(在磁盘上),而是在inode中使用34位表示秒,30位表示纳秒。超级块中的40位秒计数,没有纳秒。相当混乱,但可以完成工作(到2446年)。而且ext2和ext3似乎被32位时间卡住了。