2

組み込みシステム用のイーサネットドライバのメモリ破損の問題を調査しています。

バスマスタリングDMAコントローラと低速SDRAMの間に問題があるのではないかと思います。そのため、高速SRAMでバウンスバッファを使用したいと思います。これを行うには、2つのことが必要です。SRAMの物理アドレス(バスマスターの観点から)をDMAコントローラーバッファー記述子に配置する必要があります。DMAコントローラーが報告したら、バウンスバッファーからSDRAMのsk_buffにデータをmemcpyする必要があります。着信パケット。

読んでから私が判断できなかったこと

skb->dataが物理アドレスか仮想アドレスかです。つまり、私は呼び出す必要があります

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

また

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

パケットをsk_buffに入れて、残りのLinuxネットワークスタックがそれを処理できるようにしますか?

編集:これは問題のドライバーです。仮想アドレスをDMAコントローラーレジスタに渡しているため、機能しないと思いますが、このコードが機能する開発キットがあります。ただし、私のSDRAMはdevkit DDR SDRAMほど良いタイミングではないので、バウンスバッファを実装することを考えています。

4

1 に答える 1

4

それは仮想です。基本的foo *に、カーネル内のタイプはすべて仮想アドレスになります。実際、低レベルのメモリ管理以外の物理アドレスを処理することはほとんどありません。仮想アドレスを使用するかstruct pagekmap仮想アドレスを取得する必要があります。

于 2011-02-04T03:24:50.250 に答える