@
bengol 感谢回复,特地去看了下 ULK 的相关章节,作者总结了 3 个主要原因:
1. 有些时候连续物理页是必要的,比如 DMA
2. Even if contiguous page frame allocation is not strictly necessary, it offers the big advantage of leaving the kernel paging tables unchanged. What ’ s wrong with modifying the Page Tables? As we know from Chapter 2, frequent Page Table modifications lead to higher average memory access times, because they make the CPU flush the contents of the translation lookaside buffers.
3. 实现 hugepage ,减少了 TLB 表项从而降低 miss rate
其中第二点不是看得很懂,为什么会使 kernel paging tables unchanged ?和你说的 2 是一个意思吗?
@
Andiry 感谢回复
请问你的说 2 指的是 hugepage 吗?只有 hugepage 才会减少页表 /页目录项数
另外, xv6 里面的链表里指针指向的 object 都是一个 4k 的页,并且这个指针存在空闲页的开头 8bytes ,所以没有额外的空间复杂度;分配的时间复杂度也是 O(1),因为直接从链表头拿了。反而 buddy system 的 overhead 比链表高不少,因为它有频繁的合并和分裂内存的操作。所以链表的缺点就是没法分配连续的物理页面了,然后 buddy 就是对它的改进,是这样的吧