質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

openSUSE

openSUSEは、OpenSUSE プロジェクトによって開発されている、コミュニティベースのLinuxディストリビューションです。デスクトップやサーバなどで動作し、Webページ閲覧や、メールや写真の管理、オフィスソフト、映像・音楽の再生など、ソフトウェアパッケージが多いことが特徴です。

Q&A

解決済

2回答

10679閲覧

Linux(OpenSUSE)のDMA転送をするための物理アドレス取得方法について

sahara

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

openSUSE

openSUSEは、OpenSUSE プロジェクトによって開発されている、コミュニティベースのLinuxディストリビューションです。デスクトップやサーバなどで動作し、Webページ閲覧や、メールや写真の管理、オフィスソフト、映像・音楽の再生など、ソフトウェアパッケージが多いことが特徴です。

0グッド

0クリップ

投稿2016/10/15 07:08

とある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のインストール方法は不明です。
従って、ソースコードではなく、メモリマップの変更などの設定が不足していると予想しているのですが、問題が何かわからず困っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

下記のドライバの仕組みを利用しての開発でしょうか?

「udmabuf(User space mappable DMA Buffer)」

https://github.com/ikwzm/udmabuf/blob/master/Readme.ja.md

気になる記述がありました。
CPU: x86(64bit) の部分です。 いかがでしょうか?

対応プラットフォーム
OS : Linux Kernel Version 3.6 - 3.8, 3.18, 4.4
(私が動作を確認したのは3.18と4.4です).
CPU: ARM Cortex-A9 (Xilinx ZYNQ / Altera CycloneV SoC)
CPU: x86(64bit) ただし検証が不十分です。皆さんからの結果を期待しています。また、現時点では以下の機能に制限があります。

投稿2016/10/15 08:34

nagaetty

総合スコア1106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sahara

2016/10/15 09:43

ご回答ありがとうございます! udmabufではなく、DMA-API.txtの仕様を参考にコーディングしています。 http://tomoyo.osdn.jp/cgi-bin/lxr/source/Documentation/DMA-API-HOWTO.txt?v=linux-4.1.33 ただ、デバイスツリーの設定はしていないのでこれが原因かもしれません。 しかし、devicetreeファイルがどこにあるのかがわかりません。。。 udmabufはinsmod の引数でDMAバッファを用意する以外に、Linuxのカーネルが起動時に読み込むdevicetreeファイルによってDMAバッファを用意する方法があります。devicetreeファイルに次のようなエントリを追加しておけば、insmod でロードする際に自動的にDMAバッファを確保してデバイスドライバを作成します。
nagaetty

2016/10/15 10:14

devicetreeを少ししらべました。 ARM Linux 向けにで使用されているプロパティ情報を記述した設定ファイルのこと。 http://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e 今回は、関係ないようです。 気になるのは、/dev/以下にデバイスファイルは作成されていますか?  http://tech.g.hatena.ne.jp/rx7/20101228/p1 アクセス権なども関係しますので、ご確認ください。 メジャー番号と、マイナー番号もプログラムに合わせる必要があるかと思います。
sahara

2016/10/15 10:30

ARM以外ではdevicetreeは不要なのですね。。。 /dev/配下にデバイスファイルは作成できております。 具体的には以下の処理をしております。 MKDEV( uiMajor, 1 ); cdev_init(); cdev_add(); device_create() あと、前任者の開発環境では同じソースコードで動作していたので、カーネルの設定周りが原因かと思っているのですが、devicetreeのような設定ファイルはご存じないでしょうか。。。
nagaetty

2016/10/15 11:24

MEMIOにマップされている部分に差分がないか? 正しく動作している装置と開発環境のPCで下記を比較されてみてはいかがでしょうか? # cat /proc/iomem 装置差分か?OS差分か?悩みますね?
guest

0

解決はしませんでしたが回答いただけたかとで前に進むことができました。
調査いただきありがとうございました。

投稿2016/10/18 23:36

sahara

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagaetty

2016/10/18 23:46

お役に立てず,すみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問