2012-04-18 7 views
0

ファイル内の特定のバイトに関連付けられた(物理的な)場所を取得しようとしています。それをどうやってやりますか?Linuxのファイルの場所の物理アドレスを取得する方法

ファイルをバッファに読み込む必要があり、RAMに物理(仮想ではない)アドレスを取得しようとすると、特定のバイトではなくバッファのアドレスが取得されるため、Cではこれを実行できませんそれはファイル内にあります。

助けていただければ幸いです。

おかげ

+1

ファイル内のバイトには、考えているアドレスがありません。それらはRAMではなくディスクに保存され、RAMにアドレスを要求しています。 –

+0

私は基本的にRAMにマップされている/ shmemに "一時的に"ファイルを格納しています。 – Falcata

+0

ファイルの内容をバッファに読み込んだりmmapを使ってマップしない限り、ファイル内のバイトにはメモリアドレスはありません。 – smichak

答えて

0

それを行うためには、あなたは、デバイスから直接ファイルシステムを検査する必要があります。つまり、ビットマップテーブル、iノードテーブル、ディレクトリエントリなどを見つけることができるはずです。最近のファイルシステム(Btrfsなど)では、これはまったく簡単なことではありません。

とは別に、ブロックやセクタのオフセットやアドレス(LBAやシリンダベース)を処理する必要があります。

私の意見では、答えはではなく、であり、少なくとも、その解決策は信じられないほど複雑であると考えられます。

1

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. 

注:これは新しいカーネルのようです。また、ここにはhow to translate the PFN into a physical addressがあります。

関連する問題