【问题标题】:Is it possible to get a large page and a consecutive normal page [closed]是否可以获得大页面和连续的正常页面[关闭]
【发布时间】:2013-11-01 00:40:01
【问题描述】:

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

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

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

【问题讨论】:

  • 不知道为什么它关闭了一个完全合法的问题,这可能是不寻常的,但我确实有充分的理由,我现在已经添加了。

标签: linux windows system-calls


【解决方案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);

【讨论】:

  • 使用虚拟地址怎么样?
  • 我不明白你在问什么。当然,所有这些地址都是虚拟的。内核通常根本不会让你处理物理地址。
  • 感谢您的更新。只需请求一个大页面和一个普通页面,然后通过自定义虚拟地址重新映射即可。
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 2012-01-25
  • 1970-01-01
  • 2021-05-25
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多