組み込みシステム用のイーサネットドライバのメモリ破損の問題を調査しています。
バスマスタリング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ほど良いタイミングではないので、バウンスバッファを実装することを考えています。