2016-08-04 6 views
3

カーネルの仮想メモリにアドレスされたデバイスIOをマップするために使用されるioremapに関する基本的な質問があります。カーネル内のIORマップされたアドレス

ioremapから返されたアドレスがvirt_to_phys()のようなルーチンに渡されるかどうか知りたいのですが、デバイスのIOアドレスを返すでしょうか?それだけでいくつかの高速なアドレス演算ではなく、完全なソフトウェア・テーブル・ウォークなので

おかげ

答えて

6

virt_to_phys()は、カーネルの線形マップ内の仮想アドレスに対してのみ有効です。リニアマップは通常、RAMのみをカバーします。しかし、ioremap()によって返された仮想アドレスは、普通は(たぶん常にそうですが、すべての実装をチェックするための忍耐がありません)、vmallocアドレスであるので、それをvirt_to_phys()に渡すとナンセンスが戻ってきます。

+0

ご返信ありがとうございます。私は高速アドレス演算についてのあなたのポイントを見て、それは物理アドレスを得るために仮想アドレスからいくつかのオフセットアドレスを減算するだけです。しかし、ioremapが返した仮想アドレスからデバイスIOアドレスを返すために使用できるAPIはありますか? –

+1

通常の方法は、おそらく "最初にioremap()を呼び出したことを覚えているでしょう"。私はいくつかのマッピングされたデバイスの物理アドレスをそのデバイスのドライバから除外したいという正当な理由を考えるのに苦労しています。ドライバ内では、あなたが行くとわかっているならば、私のデータに物理アドレスを隠して将来(例えば、dmaengine要求を設定するために)それを必要とする。 – Notlikethat

関連する問題