kmalloc分配多页内存的物理页帧等相关技术疑问
针对你使用kmalloc分配多个page_size大小内存时的疑问,逐一解答如下:
问题1:分配的物理页帧是否物理相邻?
只要kmalloc分配成功,这些物理页帧一定是物理连续的。kmalloc的核心特性就是提供物理连续的内核内存,不管请求的是单页还是多页,只要在它的最大分配阈值(不同架构下通常在32~64个4KB页之间)内,分配器都会从物理连续的空闲块中划出对应大小的内存。如果请求超过阈值,kmalloc会直接返回失败,此时需要使用alloc_pages这类接口。问题2:已分配的页帧是否会被占用或重新分配?
不会。一旦kmalloc分配成功,对应的物理页帧会被内核标记为“已使用”,在你调用kfree释放之前,内核内存管理系统不会将这些页帧分配给任何其他内核组件或进程,完全属于当前分配者独占使用。问题3:是否会触发Major Page Fault?
不会。kmalloc是内核态的内存分配,分配的是实际存在的物理内存,并且会直接映射到内核的线性虚拟地址空间,不需要从磁盘交换区加载页面。Major Page Fault的本质是需要从磁盘读取缺失的页面,而内核态的kmalloc分配不存在这种场景,因此不会触发。问题4:用vmalloc替代kmalloc是否会导致页帧随机化?
不会。vmalloc的特性是虚拟地址连续,但物理地址离散,它会将零散的空闲物理页映射到一段连续的虚拟地址上,但内核并没有为vmalloc设计主动的页帧随机化机制(用户态的ASLR随机化不涉及内核态的vmalloc)。物理页的选择只是基于当前空闲页的状态,并非刻意随机分布,只是因为不需要物理连续,所以看起来像是“随机”的而已。
内容的提问来源于stack exchange,提问作者HITAISHI BARAI

