kmalloc()
オフセットを追加するだけで、仮想メモリ空間が物理メモリ空間に直接マッピングされるため、カーネルに連続した物理ページを割り当てると思います。
しかし、なぜそれがより効率的であるかはまだわかりませんvmalloc()
。まだページ テーブル (カーネル ページ テーブル) を通過する必要がありますよね? プロセスがカーネルに切り替わるときに MMU が無効にならないためです。では、なぜ Linux はカーネルの仮想空間を物理メモリに直接マップするのでしょうか? メリットは何ですか?
にはinclude/asm-x86/page_32.h
、次のものがあります。
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
カーネルが物理アドレスを計算する必要があるのはなぜですか? とにかく、メモリにアクセスするには仮想アドレスを使用する必要がありますよね?物理アドレスが必要な理由がわかりません。