3

Linuxカーネルを読んでいます。データをメモリに書き込む方法に興味があります。

ドライバーの一部では、関数でwritel()定義された関数を使用し、その関数の定義で命令asm/io.hを使用しmovntiます-実際、この命令が一種の命令であることを除いて、この命令が何を意味するのかわかりませんmov

writel()とにかく、メモリにデータを書き込むとき、使用とメモリへの直接書き込みの違いは何ですか **address = data;

これがケースです:

static inline void __writel(__u32 val, volatile void __iomem *addr)
{
    volatile __u32 __iomem *target = addr;
    asm volatile("movnti %1,%0"
             : "=m" (*target)
             : "r" (val) : "memory");
}

これは別のケースです:

*(unsigned int*)(MappedAddr+pageOffset) = result;
4

2 に答える 2

2

writelメモリ マップド IO を対象としているように見えますが、これをサポートするためのいくつかの方法があります。最初に、volatileポインターの使用 (呼び出しの並べ替えや最適化などの最適化を防ぎます) と非一時的な命令 (IO 書き込み/もちろん、iomem注釈もこれをサポートしているようです。

于 2013-07-17T07:21:13.023 に答える
1

これを正しく理解していれば、moventi命令を使用すると、プロセッサのデータ キャッシュへの影響を最小限に抑えることができます。代わりに使用*(unsigned int*)(MappedAddr+pageOffset) = result;すると、コンパイラは好きな命令を自由に選択できるmoveようになり、キャッシュラインがキャッシュに取り込まれる命令を選択する可能性が高くなります。メモリマップされたデバイスとやり取りしている場合、これはおそらくあなたが望むものではありません。

于 2013-07-17T07:22:17.037 に答える