2016-05-31 5 views
2

ユーザ空間から巨大なページ(2 MB)の物理アドレスを取得する必要があります。私はhttps://shanetully.com/2014/12/translating-virtual-addresses-to-physcial-addresses-in-user-space/#codeprocpidpagemapcodeに示されているように、ページマップから通常の4KBページの物理アドレスを取得することができましたが、ページページの物理アドレスを取得するためにはどのようにpagemapを使うべきか分かりません。 pagemapには巨大なページのフレーム番号がどのように表現されていますか?すべての参照、特にコードの一部は高く評価されます。巨大なページの物理アドレスを取得する方法

+1

[ページマップのドキュメント](https://www.kernel.org/doc/Documentation/vm/pagemap.txt)を読んだことがありますか?あなたが提供したリンクからも参照されます。特に 'COMPOUND_HEAD'と' COMPOUND_TAIL'を記述するセクション。 – kaylum

+0

私はページマップのドキュメントを見てきましたが、あまり説明しなかった巨大なセクションの下にあります。だからCOMPOUND_HEADとCOMPOUND_TAILによれば、私の2MBのバッファの先頭は頭でなければならないので、私のバッファの最初の4KBの任意の場所は、巨大なページ全体のPFNにマップされるべきですか?どのように値を解釈すればよいですか? PFNの最後に9個のゼロが必要ですか?ビット10以上は、オフセットを拡張する物理メモリのビットと考えていますか? – alex10791

答えて

1

同じである必要があります。通常のページと巨大なページの主な違いは、ページテーブルのいくつかのレイヤーです。巨大なページ(少なくともx86上)では、ページテーブルのウォークが早く終了します。

巨大ページのサイズは、通常、2MBの場合は21ビットがすべてゼロになるように、サイズに合わせて調整する必要があるため、一般的なページよりもゼロで終わります。

あなたの読み込みから-EINVALを取得している場合、(例では、バイトの間違った番号を読み取っ)pagemap documentationからこの引用をチェックアウト:あなたの場合のファイルのいずれかからの読み取り

は-EINVAL戻ります が8バイトの境界で読み込みを開始していない(たとえば、ファイルに奇数の バイトを検索した場合)か、または読み込みのサイズが の8バイトの倍数でない場合などです。

+0

しかし同じではないかもしれません。あなたがどんなエラーを出しているのかを教えてください。私はなぜそれが分かるのか分かります。 – ruthafjord

+0

ありがとう、それは現時点で動作するようです。私は、意味のある末尾のゼロがたくさんあるアドレスがあることに気がつきましたが、確かにわかりませんでした。私は盲目的に頼りにしたくない観測でした。再度、感謝します – alex10791

関連する問題