私は組み込みシステムのイーサネットドライバでメモリ破損の問題を調査しています。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ほど良いタイミングを持っていないので、私はバウンスバッファを実装しようと考えています。
ええと、それは同じバッファを指しているので、それはバーチャルでなければなりませんか? –
@ニコライ:何と同じバッファー? –
@Ben、 '* head'、' * tail'、 '* end'と同じです。たとえば、ハードウェアと話すときに 'skb-> data'に' pci_map_single'を実行するe100コードを見てみましょう。http://lxr.linux.no/#linux+v2.6.37/drivers/net/ e100.c#L1883 –