我正在尝试获取与文件中特定字节关联的(物理)位置。我该怎么做呢?
我不能在 C 中执行此操作,因为我必须将文件读入缓冲区,如果我尝试在 RAM 中获取物理(非虚拟)地址,我将获得缓冲区的地址而不是特定字节中的文件。
帮助将不胜感激。
谢谢
我正在尝试获取与文件中特定字节关联的(物理)位置。我该怎么做呢?
我不能在 C 中执行此操作,因为我必须将文件读入缓冲区,如果我尝试在 RAM 中获取物理(非虚拟)地址,我将获得缓冲区的地址而不是特定字节中的文件。
帮助将不胜感激。
谢谢
通过 将共享内存映射到您的进程中mmap
,访问包含错误数据的页面,然后读取/proc/self/pagemap
以查找有关虚拟内存页面如何映射到物理内存的信息。
* /proc/pid/pagemap. This file lets a userspace process find out which
physical frame each virtual page is mapped to. It contains one 64-bit
value for each virtual page, containing the following data (from
fs/proc/task_mmu.c, above pagemap_read):
* Bits 0-54 page frame number (PFN) if present
* Bits 0-4 swap type if swapped
* Bits 5-54 swap offset if swapped
* Bits 55-60 page shift (page size = 1<<page shift)
* Bit 61 reserved for future use
* Bit 62 page swapped
* Bit 63 page present
If the page is not present but in swap, then the PFN contains an
encoding of the swap file number and the page's offset into the
swap. Unmapped pages return a null PFN. This allows determining
precisely which pages are mapped (or in swap) and comparing mapped
pages between processes.
Efficient users of this interface will use /proc/pid/maps to
determine which areas of memory are actually mapped and llseek to
skip over unmapped regions.
注意:这似乎只在较新的内核上。此外,这里是如何将 PFN 转换为物理地址。
为此,您应该直接通过设备检查文件系统。这意味着您应该能够找到位图表、索引节点表、目录条目和类似的东西。对于现代和即将推出的文件系统(例如 Btrfs)来说,这一点都不是微不足道的。
除此之外,您应该处理块和扇区偏移或地址(可能是 LBA 或可能基于柱面)。
因此,在我看来,答案是否定的,或者至少,它的解决方案将非常复杂。