0

是否有可能获得一个大页面和一个连续的普通页面。

我正在编写一个运行时,我想用一个 4K 保护页面创建 2M 堆栈。它需要扩展到 10 个进程,每个进程有 10 个线程。

由于 TLB 未命中而考虑使用 2 Meg 页面,这通常不是 C / C++ 的问题,但通过区域分析,我们将在堆栈上拥有更多数据(整个区域),因此它不仅仅是最后的热页面。

4

1 回答 1

1

就 Linux 而言,就其本身而言,当然可以先分配一个大页面,然后再分配一个正常分配的小区域:

mmap(base, 1 << 21, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED, -1, 0);
mmap(base + (1 << 21), 1 << 12, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);

但是,我几乎不认为有任何方法可以让内核为您正确管理地址,以便您可以让它自动为您分配地址,同时找到一个有保证的免费页面的地址,所以您可能会必须手动进行地址分配。

编辑:实际上,我将不得不修改该声明;有一种相当简单的方法可以获得该保证,至少只要您没有运行可能同时进行分配的多个线程。只需分配两个大页面,释放后者,然后在现在空闲的空间中分配小页面:

p = mmap(NULL, 2 << 21, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
mremap(p, 2 << 21, 1 << 21, 0);
mmap(p + (1 << 21), 1 << 12, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
于 2013-11-01T00:45:32.767 回答