据说当我们使用 kmalloc() 时,该函数返回连续的物理内存块(如果可用),而使用 vmalloc() 时,我们得到非连续的内存块(如果可用)。
进一步说明,与非连续内存块相比,连续内存块的访问速度更快[Source Link] .
更具体地说,让我们考虑两种情况:
设 1 个物理框架 = 4 KB,页面大小 = 4 KB
案例一: 在我的模块代码中,我使用 kmalloc() 将 20 KB 内存分配给一个 char 数组;调用成功。
案例二: 我已经使用 vmalloc() 完成了上述请求并且调用成功了。
我的问题是:
a) 与 vmalloc() 相比,kmalloc() 完成请求所需的时间为何更少?
b) 与非连续分配相比,连续分配如何导致内存的快速访问?
在每种情况下,CPU 生成虚拟地址,提供给 MMU(如果 TLB 未命中),执行页面遍历,识别帧号,然后将虚拟地址转换为物理地址。地址是连续的还是不连续的有什么关系?
最佳答案
对于 kmalloc,整个物理 RAM 已经以偏移量1 1:1 映射,即物理 RAM 地址 N 映射到虚拟地址 N+PAGE_OFFSET。这使得使用 kmalloc 的分配比使用 vmalloc 更简单,因为 vmalloc 必须找到空闲页面并设置页表,以便将页面映射到连续的地址 block 。
访问 kmalloc 与 vmalloc 分配的内存时,访问时间没有差异,除了您链接到的文档中提到的页面错误。
1 物理内存多于为内核保留的虚拟地址空间的系统除外。
关于linux - 连续的内存块如何减少内存访问时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43865379/