Linux

如何在 Linux 中啟用 4G/4G 拆分?

  • January 20, 2018

對於使用(……仍然必須使用)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 拆分是公平的。

引用自:https://unix.stackexchange.com/questions/388156