Linux用户空间如何获取PAGE_SHIFT值?是否有标准方法?
用户空间获取PAGE_SHIFT的正确姿势
先直接给结论:没有标准的POSIX接口能直接获取PAGE_SHIFT,你只能通过sysconf(_SC_PAGESIZE)拿到的页大小来计算得出。
为啥没有直接接口?
POSIX标准只定义了获取页大小的_SC_PAGESIZE(也可使用_SC_PAGE_SIZE)配置项,毕竟PAGE_SHIFT本质是页大小以2为底的对数——而Linux的页大小始终是2的幂,这个值属于内核实现细节,用户空间的标准接口不会直接暴露它。
计算方法
因为Linux页大小肯定是2的整数次幂,所以PAGE_SHIFT就是log2(页大小),这里给两种靠谱的实现方式:
通用位运算循环(兼容性拉满)
不依赖任何编译器内置函数,所有环境都能跑:#include <unistd.h> #include <stdio.h> int get_page_shift() { long page_size = sysconf(_SC_PAGESIZE); if (page_size <= 0) { // 处理获取页大小失败的异常 return -1; } int shift = 0; long temp = page_size; while (temp > 1) { temp >>= 1; shift++; } // 额外验证,防止极端异常情况 if ((1L << shift) != page_size) { return -1; } return shift; }编译器内置函数(更高效)
如果用GCC或Clang,可以用__builtin_ctz函数——它会统计二进制数末尾0的个数,而2的幂的二进制只有最高位是1,其余都是0,所以末尾0的个数正好就是PAGE_SHIFT:#include <unistd.h> #include <stdint.h> int get_page_shift() { long page_size = sysconf(_SC_PAGESIZE); if (page_size <= 0 || (page_size & (page_size - 1)) != 0) { // 页大小无效或不是2的幂(Linux下基本不会触发) return -1; } return __builtin_ctz((uint64_t)page_size); }
小提醒
- 必须先检查
sysconf(_SC_PAGESIZE)的返回值是否大于0,避免无效输入导致计算出错。 - Linux系统里页大小必然是2的幂,验证步骤更多是容错用的,实际场景中很少会触发错误分支。
内容的提问来源于stack exchange,提问作者Galux Trabakoulas
相关产品推荐
相关产品推荐

