BtrFS中的逻辑地址映射

我试图通过挖掘驱动器的十六进制表示形式(xxd / dev / sd **)从BtrFS驱动器中手动还原一些文件内容。

我认为可以完成的唯一方法是在文件树中的某个位置找到file_extent_item。然后,我将查找存储在此项中的扩展数据的开始的逻辑地址,最后转到该偏移量以提取字节。我遇到的问题是这种偏移量与磁盘的偏移量不完全对应。

我制作了一个脚本,该脚本将提取存储在元数据块头中的逻辑地址,然后将其与找到该元数据块的磁盘上的地址进行比较。以下是一些结果:

Phy. address: 150 0000h
Log. address: 150 0000h (match up)

Phy. address: 250 0000h
Log. address: 1D0 0000h (-80 0000h)

Phy. address: 824F C000h
Log. address: 41CF C000h (-4080 0000h)

我想了解这些差异是如何发生的以及如何跟踪它们,因此可以通过file_extent_items中给出的逻辑地址来定位数据扩展区。是否有人知道这个谜的答案(或者,如果有一个:P,如何以另一种方式查找文件内容)?

附言我无法通过文件内容查找文件,因此唯一的方法是通过btrfs _ *** _ items查找文件。