如何计算大于指定大小的页大小倍数并使用aligned_alloc替代pvalloc?
计算buffer_size的逻辑
要得到大于等于sizeof(MyObject)的最小页大小倍数,可使用向上取整到页边界的经典计算方式:将目标大小加上页大小减一,再做整数除法取商,最后乘以页大小。这样能确保结果刚好是足够容纳MyObject的最小页对齐尺寸。
补全后的代码如下:
#include <unistd.h> // 用于sysconf #include <stdlib.h> // 用于aligned_alloc、memset、exit #include <sys/mman.h> // 用于mprotect #include <stdio.h> // 用于perror // 获取页大小,sysconf返回long类型,需转为size_t static const size_t page_size = (size_t)sysconf(_SC_PAGE_SIZE); // 计算最小的页对齐buffer大小 static const size_t buffer_size = ((sizeof(MyObject) + page_size - 1) / page_size) * page_size; MyObject *ptr = aligned_alloc(page_size, buffer_size); if (ptr == NULL) { perror("aligned_alloc failed"); exit(EXIT_FAILURE); } memset(ptr, 0, buffer_size); // 修正原代码中"pcj"的拼写错误 // 按需修改内存内容... // 设置只读保护 if (mprotect(ptr, buffer_size, PROT_READ) == -1) { perror("mprotect failed"); free(ptr); exit(EXIT_FAILURE); }
关键说明:
- 向上取整公式:
((X + Y - 1) / Y) * Y是C中对正整数X向上取整到Y的倍数的标准写法,这里X是sizeof(MyObject),Y是page_size。 - 类型安全:
sysconf(_SC_PAGE_SIZE)返回long,强制转换为size_t以匹配内存分配函数的参数类型。 - 错误处理:添加了
aligned_alloc和mprotect的错误检查,避免忽略分配或保护失败的情况。
内容的提问来源于stack exchange,提问作者firebush
相关产品推荐
相关产品推荐

