我正在研究小型 ext2 文件系统映像操作工具(例如列出目录、添加和提取文件而无需挂载它)。我刚刚遇到了 Unix 时间戳字段的问题。它们在 ext 文件系统中都是 32 位的。众所周知,32 位 Unix 时间戳在 2038 年后将不再起作用。大多数软件只需将 time_t 的定义更改为 64 位即可轻松解决此问题。但是对于文件系统来说并不是那么容易。它们需要与现有实现兼容,但需要不时更新。ext 文件系统究竟是如何做到这一点的?特别是s_mtime
, s_wtime
, s_lastcheck
, i_atime
, i_ctime
,i_mtime
和等字段i_dtime
。
user3731418
问问题
292 次
1 回答
3
如果你看一下ext4 的 inode 结构,你会看到:
struct ext4_inode {
...
__le32 i_ctime; /* Inode Change time */
...
__le32 i_ctime_extra; /* extra Change time (nsec << 2 | epoch) */
...
};
你不会发现i_ctime_extra
被使用(*叹气*)。相反,您会发现:
#define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode) \
do { \
(inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime); \
if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) { \
ext4_decode_extra_time(&(inode)->xtime, \
raw_inode->xtime ## _extra); \
} \
else \
(inode)->xtime.tv_nsec = 0; \
} while (0)
#define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode) \
do { \
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime)) \
(einode)->xtime.tv_sec = \
(signed)le32_to_cpu((raw_inode)->xtime); \
else \
(einode)->xtime.tv_sec = 0; \
if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra)) \
ext4_decode_extra_time(&(einode)->xtime, \
raw_inode->xtime ## _extra); \
else \
(einode)->xtime.tv_nsec = 0; \
} while (0)
如果你看一下用法,你会发现在内存中,使用了一个 64 位整数,分隔只存在于磁盘上。
于 2020-02-23T03:14:40.810 回答