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