linux-kernel - 为什么内核关心发布物理上连续的页面?

标签 linux-kernel

当进程从 Linux 内核请求物理内存页面时,内核会尽力提供内存中物理连续的页面块。我想知道为什么页面物理上是连续的很重要;毕竟,内核可以通过简单地提供几乎连续的页面来掩盖这一事实。

然而内核肯定会尽最大努力提供物理上连续的页面,所以我试图弄清楚为什么物理连续性如此重要。我做了一些研究,并通过几个来源发现了以下原因:

1) 更好地利用缓存并实现更低的平均内存访问时间(GigaQuantum:我不明白:如何?)

2)为了映射物理上不连续的页面,你必须摆弄内核页表(GigaQuantum:我不明白这个:不是每个页面都单独映射吗?必须做哪些摆弄?)

3) 物理上不连续的映射页面会导致更大的 TLB 抖动(GigaQuantum:我不明白:如何?)

根据我插入的评论,我不太明白这三个原因。我的任何研究来源也没有充分解释/证明这三个原因。谁能更详细地解释一下这些?

谢谢!将帮助我更好地理解内核...

最佳答案

主要答案实际上在于您的第二点。通常,当内存在内核中分配时,它不会在分配时映射 - 相反,内核使用简单的线性映射预先映射尽可能多的物理内存。在分配时,它只是为分配分配一些内存 - 由于映射没有改变,它必须已经是连续的。

物理内存的大型线性映射是有效的:既因为可以使用大页面(它占用更少的页表条目空间和更少的 TLB 条目),并且因为更改页表是一个缓慢的过程(所以你想要以避免在分配/解除分配时这样做)。

可以使用 vmalloc() 请求仅逻辑线性的分配。界面而不是 kmalloc() .

在 64 位系统上,内核的映射可以涵盖整个物理内存——在 32 位系统上(除了那些具有少量物理内存的系统),只有一部分物理内存被直接映射。

关于linux-kernel - 为什么内核关心发布物理上连续的页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8123952/

相关文章:

c - 平衡 Linux 内核中的内存使用

linux - 从 Linux 内核发送 UDP 数据包

linux-kernel - 如何从用户模式切换到内核模式?

linux-kernel - 尝试 modprode 驱动程序后出现 "unable to handle kernel null pointer derefernce at null"

linux - 解释修补/保护 POP SS 后跟#BP 中断 (INT3) 的 Linux 提交消息

linux-kernel - 使用 msleep 唤醒处于 sleep 状态的内核线程

linux - 修改 Beaglebone Black 的设备树

c++ - 内核模块周期性调用用户空间程序

linux-kernel - 在持有自旋锁时避免 sleep

linux-kernel - linux内核如何实现2个进程之间的共享内存