ファイル内の特定のバイトに関連付けられた (物理的な) 場所を取得しようとしています。どうすればそれを行うことができますか?
ファイルをバッファに読み込む必要があり、RAM で物理 (仮想ではない) アドレスを取得しようとすると、バッファ内の特定のバイトではなくバッファのアドレスを取得するため、C ではこれを行うことはできません。ファイル。
助けていただければ幸いです。
ありがとう
ファイル内の特定のバイトに関連付けられた (物理的な) 場所を取得しようとしています。どうすればそれを行うことができますか?
ファイルをバッファに読み込む必要があり、RAM で物理 (仮想ではない) アドレスを取得しようとすると、バッファ内の特定のバイトではなくバッファのアドレスを取得するため、C ではこれを行うことはできません。ファイル。
助けていただければ幸いです。
ありがとう
を介して共有メモリをプロセスにマップし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 を物理アドレスに変換する方法を示します。
そのためには、デバイスを介してファイルシステムを直接検査する必要があります。つまり、ビットマップ テーブル、i ノード テーブル、ディレクトリ エントリなどを見つけることができるはずです。これは、最新のファイルシステムや今後のファイルシステム (Btrfs など) ではまったく問題ありません。
それとは別に、ブロックとセクターのオフセットまたはアドレス (おそらく LBA またはシリンダーベース) を処理する必要があります。
したがって、私の意見では、答えはノーです。少なくとも、その解決策は信じられないほど複雑になるでしょう。