在堆上分配小于 4KB 的空间?

Allocating less than 4KB on Heap?

请注意我在已接受答案下的后续问题。

我刚读到有关如何完成从虚拟内存到物理内存的转换,我得到了一个有趣的问题。

如果物理内存中帧的最小大小是 4KB,那为什么不说我们可以使用堆来分配最小 4KB 的内存? 或者,如果我只想要堆上的 1 个字节,那么它会分配整个 4KB 的帧,其余部分保持未使用状态(即使其他人有 space) 或者它与其他 allocations/process 分开,因为我们有偏移字段?

试试这个代码:

int main()
{
    int* a = malloc(sizeof *a);
    int* b = malloc(sizeof *b);
    printf("%p\n", (void*)a);
    printf("%p\n", (void*)b);
    return 0;
}

可能的输出:

0x2164010
0x2164030

如您所见,分配的内存在同一个 4KB 页面 (0x2164xxx) 内,它与页面有 16 字节偏移和 16 字节对齐。

即使从物理地址到虚拟地址的映射是在某个页面大小(例如 4KB)上完成的,在一个映射页面中也可能有多个动态分配。