2

こんにちは、2 MB の kmalloc (物理連続メモリ用) を実行し、その仮想アドレスをバス アドレスに変換しvirt_to_bus()てアプリケーションに送り返すカーネル モジュールを作成しました。

Linux を実行している別のシステムに転送し、pcie-link を使用してホスト システムに接続する必要があるため、バス アドレスが必要です。これで、別のシステムがこのバス アドレスを使用して DMA 転送を開始できるようになります。

問題は次のとおりvirt_to_bus()です。非推奨であり、警告が表示されます。このアドレスをバスアドレスに変換する他の方法はありますか?

4

1 に答える 1

5

このアドレスをバスアドレスに変換する他の方法はありますか

はい、使用しますvirt_to_phys。カーネルのクイックトリップは、x86 でこれを示しています。

#define virt_to_bus virt_to_phys
#define bus_to_virt phys_to_virt

asm-generic/io.h で定義されている一般的な対応物は、それぞれunsigned long/にキャストするだけvoid *です。


もちろんPAGE_OFFSET、物理アドレスを取得するために線形マップ メモリをいつでも差し引くことができることはご存知でしょう。

編集

腕を使っています

その場合、おそらく を探しているでしょうdma_map_single

static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
    size_t size, enum dma_data_direction dir)

バッファは事前に割り当てる必要があります (たとえば、kmalloc() を使用)。そのための DMA は dma_map_single() でセットアップされます。


私は DMA の経験がほとんどありませんがdma_map*virt_to_bus.

于 2012-05-11T07:25:11.313 に答える