2011-02-03 21 views
2

私は組み込みシステムのイーサネットドライバでメモリ破損の問題を調査しています。Linuxのsk_buffでは、skb-> dataは物理アドレスか仮想アドレスですか?

バスマスタDMAコントローラと低速SDRAMの間に問題があると思われます。だから私は高速SRAMでバウンスバッファを使いたいと思っています。これを行うには、私は2つのことが必要です:DMAコントローラのバッファディスクリプタにSRAMの物理アドレス(バスマスタの観点から)を置く必要があります。着信パケット。私は

を読んでから、決定することができていない何

はskb->データを物理または仮想アドレスであるかどうかです。すなわち、私は

memcpy(skb->data, phys_to_virt(bounce_addr), len); 

または

memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len); 

は、Linuxネットワークスタックの残りの部分は、それを処理できるようにsk_buffにパケットを取得するために呼び出す必要がありますか?

編集:This is the driver in question。私はそれがDMAコントローラのレジスタに仮想アドレスを渡しているので、動作しないと思いますが、私はこのコードが動作するdevkitを持っています。しかし私のSDRAMはdevkit DDR SDRAMほど良いタイミングを持っていないので、私はバウンスバッファを実装しようと考えています。

+0

ええと、それは同じバッファを指しているので、それはバーチャルでなければなりませんか? –

+0

@ニコライ:何と同じバッファー? –

+0

@Ben、 '* head'、' * tail'、 '* end'と同じです。たとえば、ハードウェアと話すときに 'skb-> data'に' pci_map_single'を実行するe100コードを見てみましょう。http://lxr.linux.no/#linux+v2.6.37/drivers/net/ e100.c#L1883 –

答えて

4

これは仮想です。基本的には、カーネルにタイプfoo *のものはすべて 仮想アドレスになりますが、実際には、低レベルのメモリ管理外の物理アドレス のアドレスを処理することはまれです。 またはstruct pageには、kmapに仮想アドレスを取得する必要があります。

+0

私はあなたが「低レベルのメモリ管理の外にある物理的なアドレスをめったに扱っていない」ことを意味すると思います。しかし、明らかにそうではありません.DMA機能を備えたデバイスのドライバは、デバイスにDMAバッファの物理アドレスを伝える必要があります。それが私の質問です。私は、逆参照することはできないが、そうでない既存のソースコードを見ているので、物理アドレスはポインタではなくポインタサイズの整数型に保持されるべきだと考えるべきである。たぶん、この特定のドライバーはちょうどよく書かれていません。 –

+0

ありがとう、タイプミスを修正しました。私の経験は、デバイスドライバの代わりにコアカーネルコードを使っていることがほとんどだと思います。だから、私は実際にランダムなドライバのことを話すことができません。私はよく書かれたものが区別をすることを期待していますが、そこには多くの厄介なものがあります。 – nelhage

関連する問題