仮想アドレス空間レイアウト [mem_map/memmap]

VMEMMAP_SIZE

 カーネルはページ構造を使用して物理ページを記述し、メモリのすべての物理ページはページ構造の配列に対応します。メモリの物理アドレス空間が不連続で穴が多い場合、それをスパースメモリと呼びます。vmemmap 領域は、スパース メモリのページ構造配列の仮想アドレス空間です。

 コメントによると、この領域のサイズはすべての構造体ページ オブジェクト配列を格納でき、この配列は線形マッピング領域全体をカバーできます。 
#define VMEMMAP_SIZE \

(UL(1) << (VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT))

(カーネル仮想空間のサイズ/4096/2=ページ構造によって占有される仮想メモリの合計に対応する、カーネルの線形マップされたアドレス空間内のページ数 (P)=P*BITS( STRUCT_PAGE_MAX_SHIFT )=2^6*P )


例: 構造体ページのサイズは 44 バイトです。2^5 = 32 < 44 ; 2^6 = 64 > 44; この場合、STRUCT_PAGE_MAX_SHIFT は 6 になります。シフトはシフト、マックスは最大です。このような大きな空間であれば、次の構造体ページオブジェクトを確実に格納することができます。

2モジュール

CONFIG_MODULES 関数が定義されている場合、insmod によって挿入されるモジュール用にユーザー空間にスペースを空ける必要があります。

この部分の領域は動的にマッピングされ、CONFIG_HIGHMEM を定義する場合、0xbf00000 ~ 0xbfe00000 の 16MB-2MB=14MB になります。

AARCH64では128Mです

 

おすすめ

転載: blog.csdn.net/y13182588139/article/details/125817492