私は書いたカスタムドライバは、正確なハードウェア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で共通のハードウェアメモリ上で実行してから読み込みを試みる類似のコードがあります。その読書には、私が書いた価値は含まれていません。
なぜですか?
私はあなたがそうしているとは思わない。例えば、私は「ioremapから返されたアドレスは直接参照解除されるべきではなく、代わりに[makelinux.net](httpでデバイスドライバを書くことについての議論では、カーネルによって提供されるアクセサ関数が使われるべきであることを覚えています。 ://www.makelinux.net/ldd3/chp-9-sect-4)。もしそのサイトが信じられるなら、 'iowrite32()'を使ってあなたの質問にあるI/Oメモリへの特定の書き込みを行うべきです。 –
ありがとう、私はその部分を逃して、おそらく何かを壊した。私は明日それを試してみるでしょう、そしてうまくいけば、私はそれを受け入れることができるようにあなたの答えを回答箱に入れてください。 –
私はiowrite32を使うべきです...しかし、それは私が書いているだけのラムです。返される実際の仮想アドレスは実際の参照不可能なエンティティではなく、代わりにページテーブルのキーが書き込みが発生する場所にあるため、iowriteファミリを使用するはずですか? –