我正在阅读有关 NTFS 的文章,我发现 NTFS 使用 LCN(逻辑簇号)地址来表示文件。有关数据块的信息存储在位于 MFT 中的文件的 FCB 中。
据我了解,我相信情况是这样的:
当某个进程请求文件读取/写入时,该进程将使用 LCN,然后通过乘以 LCN * 簇大小将这些 LCN 转换为 LBA 地址。然后这些 LBA 地址被发送到磁盘控制器,然后磁盘控制器将这些 LBA 地址转换为数据所在的实际物理块。
更具体地说:一个进程发出一个系统调用 open(),指定文件名和访问权限,然后在系统范围表中找到相应的文件(假设其他进程也在使用该文件),FCB 被复制到每个进程表,然后 FS 使用所有这些映射根据进程需要获取文件块!
我的理解正确吗?
参考:
书:操作系统概念页数:568
同一本书页数:875
引用:
NTFS 使用逻辑簇号 (LCN) 作为存储地址。它通过从设备开头到结尾对簇进行编号来分配它们。使用此方案,系统可以通过将 LCN 乘以簇大小来计算物理存储偏移量(以字节为单位)。
答案1
你只需要几样东西。
- 文件系统的偏移量(处理 NTFS 时通常是分区的起始位置),也称为“隐藏扇区”
- 您需要知道每个簇的扇区
我们可以从卷引导块中获取所有这些信息:
然后我们得到 LBA = 隐藏扇区(偏移量)+ LCN *(每个簇的扇区数)
注意:对于我的数据恢复相关工具,我从不依赖引导扇区中的“隐藏扇区”字段,而是依赖引导扇区的实际 LBA 地址,并假设它是我计算簇的偏移量。
然后这些 LBA 地址被发送到磁盘控制器,磁盘控制器随后将这些 LBA 地址转换为数据所在的实际物理块。
是的。如果我们假设是传统驱动器,则不会发生 LBA 到任何内容的转换。但即使我们考虑 SMR 或 SSD 驱动器,其中 LBA 地址动态映射到物理地址,从操作系统的角度来看,没有任何变化,因为该部分由驱动器的固件处理。
NTFS 使用逻辑簇号 (LCN) 作为存储地址。它通过从设备开头到结尾对簇进行编号来分配它们。
我宁愿将其称为文件系统的开始,因为在我看来,设备很容易与物理设备或驱动器混淆,LBA 0 是它们的开始。我们不从 LBA 0 开始计算簇,而是从簇0(在 NTFS 的情况下)。因此,我们需要相对于 LBA 0 的簇 0 偏移量。
由于在 NTFS 中一切是一个文件,引导“扇区”本身(在 $MFT 中称为 $Boot)也是一个文件。由于它是卷或文件系统的第一个文件,因此我们可以在零簇中找到它。