You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用malloc分配内存时调用mincore会报“无效参数”错误?

为何malloc分配内存时调用mincore返回"Invalid argument",而mmap可以?

根本原因在于mincore的两个硬性要求

1. 传入的地址必须严格页对齐

mincore()系统调用明确要求第一个参数addr必须是页大小的整数倍(即地址落在页边界上)。而malloc()返回的地址仅保证满足基础数据类型的对齐需求(比如对齐到8字节或16字节),完全不保证页对齐。当你把非页对齐的地址传给mincore时,系统直接返回EINVAL(无效参数)错误。

2. 仅支持mmap创建的内存映射区域

mincore只能处理通过mmap()创建的内存区域——不管是匿名映射(MAP_ANONYMOUS)还是文件映射。而malloc()分配小块内存时,通常是通过brk()/sbrk()扩展进程堆实现的,这部分内存不属于mmap映射范畴,mincore无法识别。即便malloc分配大内存时会 fallback 到mmap,你也无法保证返回的地址一定页对齐,且这种依赖实现的行为不可靠。

验证与修复示例

验证地址对齐问题

可以在代码中添加打印,确认malloc返回的地址是否页对齐:

printf("malloc ptr: %p, page size: %zu\n", ptr, page_size);
printf("页对齐?%s\n", ((uintptr_t)ptr % page_size) == 0 ? "是" : "否");

几乎会输出"否",这就是问题所在。

修复方案

要让mincore正常工作,有两种可靠方式:

  • 方式一:使用页对齐的内存分配函数
    用posix_memalign()分配严格页对齐的内存,它的实现通常会用mmap,满足mincore的要求:
if (posix_memalign((void**)&ptr, page_size, allocated_size) != 0) {
    perror("posix_memalign failed");
    exit(1);
}
  • 方式二:直接使用mmap分配匿名内存
    这也是你测试中可行的方式,mmap默认会返回页对齐的地址:
ptr = mmap(NULL, allocated_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (ptr == MAP_FAILED) {
    perror("mmap failed");
    exit(1);
}

额外修正:页状态的读取错误

你的代码中还有一处逻辑错误:打印页状态时误用了ptr[i],应该读取vec[i]——vec才是mincore返回的页驻留状态数组,ptr[i]是内存中的数据内容,和页是否在物理内存中无关。修正后的循环:

for (int i = 0; i < num_of_byte_allocated; i++) {
    printf("Page[%i]: %i\n", i, vec[i] & 1);
}

内容的提问来源于stack exchange,提问作者Tran Triet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:57:17