2

是否可以使用 C 程序和 malloc 找出处理器的页面大小?而不是使用 sysconf() 调用?

4

4 回答 4

6

如果你可以#include一些linux内核头文件,你可以找到宏PAGE_SIZE

<asm/page.h>

在 cygwin(也许还有 windows 的 ddk)上,我在

<w32api/ddk/winddk.h>

在运行时计算页面大小有一些“肮脏的技巧”(非常非常肮脏!)。所有不可移植且完全依赖于系统。

让我们玩得开心!

在可能的系统上,一个可能的技巧是创建一个只有 1 个字节长的共享内存对象。系统调用通常将大小向上舍入为系统页面大小。漂白!

另一个,如果你在类unix系统上运行并且你敢拦截SIGSEGV信号,你可以尝试通过寻找有效区域来探索内存,看看它们是2的哪个幂。嗯……

那么,为什么 sysctl 不适合你呢?

问候

于 2010-03-17T08:49:32.927 回答
5

标准 C 没有“页面大小”的概念,因此根据您的标签,没有。可能有一种特定于实现的方法——你有特别厌恶使用的方法sysconf吗?我假设您提到它是因为它是一种实际获取所需信息的方法,在这种情况下,为什么不使用它呢?

于 2010-03-17T05:11:01.690 回答
2

Malloc 不太可能告诉您您想知道的内容。虽然它通常具有最小大小和分配内容的对齐考虑,但它们不一定与页面大小相同(或以任何定义的方式相关)。你愿意去别处看看吗?你运行的是什么环境?

于 2010-03-17T05:11:09.197 回答
1

(它不是真正的答案,但我无法在评论部分添加它,所以在这里回复:它只是我调查的一些结果)

(正如我在最初的问题中所说,我的兴趣纯粹是学术性的,我只需要几种方法来计算页面大小并验证它们是否都同意相同的值)

在不使用 sysconf 的情况下找出系统/微处理器的页面大小只是为了好玩!这是我到目前为止所尝试的:

- 使用 sysconf(_SC_PAGE_SIZE) 获取实际页面大小:我进入这台计算机 0x1000,它是 4K(它的 intel 386 处理器,其中加载了 32 位 linux。我的下一步将是用其他几种方式验证这个值(如果我可以可靠地找到那些)。

- 然后我分配了 1 个字节的内存

- 在一个循环中,使用偏移计数器,我写了超过 1 个字节的分配内存。它工作正常,直到 0x19a8 超过 1 页大小且略低于 2 页大小!

-SEGV 发生在 1page 到 2page 大小之间,接近尾声。这是可重复的。

- 所以这种方法无法可靠地找到页面大小。

这就是我问这个问题的原因。是否有技巧(除了使用内核中可用的直接信息)来找出页面大小?我什至准备在 malloc 上妥协(意味着使用其他技巧)。

于 2010-03-17T19:57:07.293 回答