是否可以使用 C 程序和 malloc 找出处理器的页面大小?而不是使用 sysconf() 调用?
4 回答
如果你可以#include一些linux内核头文件,你可以找到宏PAGE_SIZE
<asm/page.h>
在 cygwin(也许还有 windows 的 ddk)上,我在
<w32api/ddk/winddk.h>
在运行时计算页面大小有一些“肮脏的技巧”(非常非常肮脏!)。所有不可移植且完全依赖于系统。
让我们玩得开心!
在可能的系统上,一个可能的技巧是创建一个只有 1 个字节长的共享内存对象。系统调用通常将大小向上舍入为系统页面大小。漂白!
另一个,如果你在类unix系统上运行并且你敢拦截SIGSEGV信号,你可以尝试通过寻找有效区域来探索内存,看看它们是2的哪个幂。嗯……
那么,为什么 sysctl 不适合你呢?
问候
标准 C 没有“页面大小”的概念,因此根据您的标签,没有。可能有一种特定于实现的方法——你有特别厌恶使用的方法sysconf
吗?我假设您提到它是因为它是一种实际获取所需信息的方法,在这种情况下,为什么不使用它呢?
Malloc 不太可能告诉您您想知道的内容。虽然它通常具有最小大小和分配内容的对齐考虑,但它们不一定与页面大小相同(或以任何定义的方式相关)。你愿意去别处看看吗?你运行的是什么环境?
(它不是真正的答案,但我无法在评论部分添加它,所以在这里回复:它只是我调查的一些结果)
(正如我在最初的问题中所说,我的兴趣纯粹是学术性的,我只需要几种方法来计算页面大小并验证它们是否都同意相同的值)
在不使用 sysconf 的情况下找出系统/微处理器的页面大小只是为了好玩!这是我到目前为止所尝试的:
- 使用 sysconf(_SC_PAGE_SIZE) 获取实际页面大小:我进入这台计算机 0x1000,它是 4K(它的 intel 386 处理器,其中加载了 32 位 linux。我的下一步将是用其他几种方式验证这个值(如果我可以可靠地找到那些)。
- 然后我分配了 1 个字节的内存
- 在一个循环中,使用偏移计数器,我写了超过 1 个字节的分配内存。它工作正常,直到 0x19a8 超过 1 页大小且略低于 2 页大小!
-SEGV 发生在 1page 到 2page 大小之间,接近尾声。这是可重复的。
- 所以这种方法无法可靠地找到页面大小。
这就是我问这个问题的原因。是否有技巧(除了使用内核中可用的直接信息)来找出页面大小?我什至准备在 malloc 上妥协(意味着使用其他技巧)。