关于内核的内存分配 TLB刷新
最近在看《linux内核设计与实现》,在“内存管理”一章里看到这么一句话:
“通过vmalloc()获得的页必须一个一个地进行映射(因为他们物理上是不连续的),这就会导致比直接内存映射大得多的TLB抖动。”
感觉自己理解不是很透,希望大家能指教指教。
先说说我的理解:
当内核用kmalloc分配连续的物理内存时,内核页表不用变化,因为kmalloc分配到的是内核虚拟地址空间中的物理内存映射区域,而这部分区域的内存在kmalloc调用前就已经映射好了。 只是当内核真正去访问这些内存时,应该也可能会发生TLB的抖动。因为在访问申请到连续的物理内存时,MMU会用到内核的页表项进行虚拟地址到物理地址的转换,如果说当前所需的页表项不在TLB中时,就会换进新的PTE,换出旧的PTE.
而对于vmalloc申请的内存,在访问时由于要修改内核的页表项以使得物理上不连续的页在逻辑上连续起来,所以肯定会发生PTE的换进和换出,即肯定会发生TLB抖动。
所以 “这就会导致比直接内存映射大得多的TLB抖动”。
希望个位高手能不吝赐教~~