如何在 Linux 中啟用 4G/4G 拆分?
對於使用(……仍然必須使用)32 位二進製文件的系統來說,這是一個有用的功能,並且考慮了 4G 限制。
這實質上意味著,32 位使用者空間程式碼、32 位使用者空間數據和(32 位 PAE 或 64 位)核心位於不同的地址空間中,這基本上使程序能夠為他們的數據使用幾乎所有可能的最大 4G 地址空間。
除了一些古老的公告,不幸的是我再也找不到了:
我很高興地宣布首次公開發布適用於 2.5.74 Linux 核心的“4GB/4GB VM 拆分”更新檔:
http://redhat.com/~mingo/4g-patches/4g-2.5.74-F8
4G/4G 分離功能主要用於大型 RAM x86 系統,這些系統希望(或必須)獲得更多核心/使用者 VM,但會犧牲每個系統呼叫的 TLB 刷新成本。
眾所周知,在 x86 上,虛擬記憶體的總量被限制為 4GB。在這 4GB 虛擬機中,使用者空間使用 3GB (0x00000000-0xbfffffff),核心使用 1GB (0xc0000000-0xffffffff)。這就是 VM 方案,稱為 3/1 拆分。這種拆分在 1 GB 的 RAM 之前工作得非常好 - 即使在那之後它也能很好地工作,因為“highmem”將各種更大的記憶體(和對象)移動到高記憶體區域。
在我的測試中,我的一些程序大約在 2-3 GB 時開始消亡。
我怎麼能做到這一點?我使用相對較新的核心(4.10)。我可以在 32 位使用者空間上使用 64 位核心或使用 32 位 PAE 核心。
如果只有一些程序使用 4G/4G 就足夠了,但它們似乎確實需要它。
在 64 位核心上,您已經可以通過 32 位使用者空間程序訪問完整的 4G。通過在終端中輸入以下內容來查看自己(警告:如果您的系統在執行時沒有可用的 4GiB RAM,則可能會變得無響應):
cd /tmp cat > test.c <<"EOF" #include <stdlib.h> #include <stdio.h> int main() { size_t allocated=0; while(1) { const size_t chunkSize=4096; char* p=malloc(chunkSize); if(!p) return 0; *p=1; allocated+=chunkSize; printf("%zu\n",allocated); } return 0; } EOF gcc test.c -o test -m32 && ./test | tail -n1
在我的 x86_64 核心 3.12.18 上,我得到
4282097664
了大約 4GiB-12.3MiB 的結果,因此考慮實現 4G/xG 拆分是公平的。