Linux Fixmapの役割

1254 ワード

Fixmapsはカーネル(仮想)アドレス空間アドレスが物理メモリに固定的にマッピングされており,DMA/Normal zone物理メモリの直接アドレスマッピングと少し似ている.しかし4 GB開始部の直接アドレスマッピングは線形であり,すなわち物理アドレスと線形マッピングアドレスの間に計算式paddr=vaddr−PAGE_が存在する.OFFSET;固定アドレスマッピングは、DMA Normal Highmemを含む任意の物理アドレスをマッピングすることができる.
Fixmapsの存在意義
各固定マッピングの線形アドレスは、いくつかのポインタ変数の代わりに、カーネルが固定マッピングの線形アドレスを使用する物理メモリのページボックスにマッピングされます.これらの線形アドレスに対応する物理アドレスは変更されないためです.実際には、indexが増加すると、複数のページボックスが保持される限り、固定マッピングは複数のページボックスに対応することができる.
固定マッピング線形アドレスをポインタとする利点は、次のとおりです.
1.通常のポインタ変数よりもアドレスアクセスが1回少ない
2.カーネルはfixmapsのページ項目を確保し、コンテキスト切替時にTLBからリフレッシュされないので、アクセスは高速cacheで発生する
そうかんかんすう
inline unsigned long fix_to_virt(const unsigned int idx)

この関数は、与えられたインデックスに対応する定数線形アドレスを計算し、返されるアドレスは0 xFFFC 0000~0 xFFFFFFF 000に類似する
set_fixmap(idx, phys)

set_fixmap_nocache(idx, phys)

物理アドレスと固定マッピングの線形アドレスを関連付けてset_fixmap_Nocacheは、ページ・ボックスのデータにアクセスするときにハードウェア・キャッシュを無効にします.アクセスにキャッシュを無効にする必要がある場合があります.
一時マッピング
仮マッピングは、固定アドレスマッピングの特殊な部分であり、固定アドレスマッピングのFIX_KMAP_BEGINとFIX_KMAP_END間には、ハイエンドメモリページをマッピングするための領域が確立されます.
一時マッピングと呼ばれるのは、この領域内のマッピングが一時的に使用されているからです.固定タイプの一時マッピングには、固定された一意のアドレス(各cpuには独自の「ウィンドウ」がある)があるため、新しいマッピングを作成する際に、判断する必要がなく、元のマッピングを直接上書きすればよい.