とあるPCIeで接続するボードとの通信をDMAで実現するカーネルドライバを作成しています。
DMA転送を実現するためにdma_alloc_coherent()をコールし、カーネル空間上のメモリと、物理メモリの2つのアドレスを取得しています。
しかし、得られた物理メモリが正しくないため、DMA転送が実現できておりません。
###前提・実現したいこと
DMA転送は別のPC環境で動作していることを確認しています。
つまり、dma_alloc_coherent()で正しく物理メモリが得られています。
カーネルアドレスに対し、値をWriteし、/dev/memに値が反映されていることを確認しました。
私の開発環境では、dma_alloc_coherent()で得られたカーネルアドレスにWriteしても、/dev/memに反映されませんでした。
また、物理メモリのアドレスを直接/dev/memをWriteすることも出来ませんでした。
###発生している問題・エラーメッセージ
dma_alloc_coherent()はエラーとはならず、カーネル空間上のメモリと、物理メモリの2つのアドレスは取得できています。
しかし、得られた物理メモリのアドレスをphys_to_virt()で変換したカーネルアドレスと、dma_alloc_coherent()の戻り値のカーネルアドレスが一致しません。
###該当のソースコード
static inline void* attribute((always_inline)) func_alloc_coherent(struct device* rv_dev, size_t rv_siz, dma_addr_t* rv_pdma_handle, gfp_t rv_gfp)
void* at_ret;
dma_addr_t dma_handle; /* 物理アドレス用 */
at_ret = dma_alloc_coherent(rv_dev, rv_siz, rv_pdma_handle, rv_gfp);
pReverse = phys_to_virt( *rv_pdma_handle ); // 物理->カーネル変換
上記[at_ret]と[pReverse]が一致しない
~~~省略~~~
###試したこと
別のPCで上記[at_ret]と[pReverse]が一致することを確認しています。
私の開発環境は
###補足情報(言語/FW/ツール等のバージョンなど)
Linux環境:OpenSUSE leap 42-1 (Kernel 4.1.12-1) 64bitマシン
私の開発環境のLinuxは以下の公式サイトからダウンロードしたOSをデフォルトでインストールし、設定等は変更しておりません。
https://software.opensuse.org/421/ja
別のPCのインストール方法は不明です。
従って、ソースコードではなく、メモリマップの変更などの設定が不足していると予想しているのですが、問題が何かわからず困っています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/15 09:43
2016/10/15 10:14
2016/10/15 10:30
2016/10/15 11:24