不对吧kmalloc虚拟内存是连续的物理内存也是连续的吧
时间: 2024-03-07 08:53:43 浏览: 93
非常抱歉,我的回答还是有误。kmalloc分配的内存是虚拟内存,并且在逻辑上是连续的。这些虚拟地址被映射到物理内存中的一些物理页面,这些页面可能不是物理上连续的,但是在逻辑上是连续的,因为这些页面可以通过页表映射到一段连续的虚拟地址空间。
因此,kmalloc提供了一个虚拟内存到物理内存的映射,这使得内核可以使用虚拟地址来访问物理内存,而不必关心内存的物理地址。这种映射关系是由内核管理的,应用程序不需要知道这些细节。对于kmalloc分配的内存,应用程序只需要使用返回的虚拟地址来进行访问即可。
相关问题
kmalloc它使用物理内存不对吧
非常抱歉,我在之前的回答中有误。kmalloc分配的内存并不是物理内存,而是虚拟内存,它们通常位于内核的数据段或者内核堆栈中。kmalloc分配的内存块在逻辑上是连续的,但在物理上可能不是连续的,这取决于具体的物理内存分配算法。在使用kmalloc分配内存时,内核会自动进行物理内存映射,使得分配的虚拟内存对应到物理内存中的一段连续地址。这种映射关系可以通过调用kmap函数来获得。
再次感谢您的指正,希望这次回答能够更加准确地回答您的问题。
kmalloc分配出来的内存块是虚拟地址,而不是物理地址 那怎么确保分配出来的是连续的物理地址呢
kmalloc分配出来的内存块的确是虚拟地址,但是它们通常是连续的物理地址。这是因为kmalloc使用的buddy分配器会将内存按照2的幂次方划分成一系列大小不同的内存块,并使用一个位图来管理每个内存块的使用情况。当需要分配一块大小为n的内存时,buddy分配器会找到大于等于n的最小的2的幂次方,然后在相应的内存块链表中查找是否有空闲的内存块,如果有就分配给调用者。由于buddy分配器要求分配出来的内存块大小是2的幂次方,因此这些内存块通常是连续的物理地址,这样就可以方便地进行页表映射,从而实现虚拟地址到物理地址的转换。
阅读全文