2015-12-27 12 views
5

私は書いたカスタムドライバは、正確なハードウェアRAMメモリアドレスのユーザランドへのカスタムマッピングを容易にすることを目的としています。私は共通のメモリをテストしようとしています。同じハードウェアアドレスに対する2つのプロセス間で共有されるmmap'dは、各側が見ることができる目に見えるメモリ操作を容易にします。それはので、私は多分問題がRAMにフラッシュするようにキャッシュを強制的に書き込みバリアの欠如だと思った、結局のところ仮想メモリへの書き込みが仮想デバイスドライバに表示されないのはなぜですか?

//placement: in a mmap callback to a file_operations facilitated 
    // character device 
    //phys_addr - a variable that I will ioremap for a virtual addr 
    virtaddr = ioremap(phys_addr, size); 
    if (!virtaddr) { 
    printk(KERN_INFO "could not remap page!"); 
    goto out; 
    } else { 
    printk(KERN_INFO "attempting write"); 
    *((int *)virtaddr) = 0xdeadbeef; 
    //wmb(); <--- I haven't tried this yet 
    } 

私のコードは、およそ次のようなものです。私はこの質問の範囲外のOSの特質のために、特別なハードウェアでテストを起動しなければなりません。私は、デバイスのレジスタやデバイスのメモリ(例:SSDなどのキャッシュ)と同じように、メインメモリやRAMに書き込み障壁が当てはまるとは思わない。だから、私はwmbをテストしていないが、私はちょうどそこに私の質問を得たいと思った。私は、Linux Device Drivers 3の本で検索しましたが、コードを実行しました。私がを引っ張っている部分は、実際には実行中のです。私はprintkを見ることができるので、私はそれを知っています。ドライバはコードを実行しますが、その後も継続するように見えます。最後に、ioremapで共通のハードウェアメモリ上で実行してから読み込みを試みる類似のコードがあります。その読書には、私が書いた価値は含まれていません。

なぜですか?

+2

私はあなたがそうしているとは思わない。例えば、私は「ioremapから返されたアドレスは直接参照解除されるべきではなく、代わりに[makelinux.net](httpでデバイスドライバを書くことについての議論では、カーネルによって提供されるアクセサ関数が使われるべきであることを覚えています。 ://www.makelinux.net/ldd3/chp-9-sect-4)。もしそのサイトが信じられるなら、 'iowrite32()'を使ってあなたの質問にあるI/Oメモリへの特定の書き込みを行うべきです。 –

+0

ありがとう、私はその部分を逃して、おそらく何かを壊した。私は明日それを試してみるでしょう、そしてうまくいけば、私はそれを受け入れることができるようにあなたの答えを回答箱に入れてください。 –

+0

私はiowrite32を使うべきです...しかし、それは私が書いているだけのラムです。返される実際の仮想アドレスは実際の参照不可能なエンティティではなく、代わりにページテーブルのキーが書き込みが発生する場所にあるため、iowriteファミリを使用するはずですか? –

答えて

1

「ハードウェアRAMメモリのアドレスからユーザーランドへ」の意味を正確に教えてください。

あなたがシミュレートされているデバイスのどのようなタイプの[のPCIe、USBなど]

これは、すべてのCPUのルーティングに依存し、ハードウェアが接続されていないとして、その後の翻訳が障害を引き起こすことはありません代わりにそれはバスプロトコルを介してデータを送信しますバスコントローラからデバイスに偽のパックされた世代が好きになるでしょう。

バストランザクションを確認でき、IOポートマッピングの場合、特定のポートアドレス/ビットからの信号を使用してチェックできます。

+1

ああ私はちょうどこれを見た。 作業現場(数ヶ月前)に私は分離カーネルに取り組んでいましたが、この機能の1つは正確なアドレスに対応する特定のメモリゾーンを確保することができました。私はカスタムの/ dev/kernelドライバを使用していたので、私がシミュレーションしていたデバイスはありませんでした。 |これはすべてに依存しています... 作業の複雑さと、それが高度に特殊化された分離カーネルカーネルモジュールであるという事実のために、私はすべてを言い表すことができないからです。 私はこの問題を解決したことを知っていますが、具体的に何をしたのかを覚えていません。私が覚えていれば、私はそれを追加します。 –

関連する問題