我这样问是因为我记得属于内核的所有物理页面都固定在内存中,因此是不可交换的,就像这里所说的:http://www.cse.psu.edu/~axs53/spring01/linux/memory.ppt http://www.cse.psu.edu/~axs53/spring01/linux/memory.ppt
然而,我正在阅读一篇研究论文,并感到困惑,因为它说:
“(物理)页面经常在内核数据段和用户空间之间移动。”
它还提到,相比之下,物理页不在内核代码段和用户空间之间移动。
我认为如果一个物理页有时属于内核数据段,有时属于用户空间,那么一定意味着属于内核数据段的物理页是可交换的,这与我目前的理解相悖。
那么,属于内核数据段的物理页是可交换的吗?不可交换?
附:该研究论文可在此处获取:https://www.cs.cmu.edu/~arvinds/pubs/secvisor.pdf https://www.cs.cmu.edu/~arvinds/pubs/secvisor.pdf
请搜索“之间移动”,您会找到它。
附:同样,从[3G + 896M]到4G的虚拟内存区域属于内核,用于映射ZONE_HIGHMEM中的物理页(x86 32位Linux,3G + 1G设置)。在这种情况下,内核可能首先将该区域中的一些虚拟页映射到承载当前进程页表的物理页,修改一些页表条目,并取消映射虚拟页。这样,物理页有时可能属于内核,有时属于用户空间,因为它们在取消映射后不属于内核,从而变得可交换。是这个原因吗?
tl;dr - 内存池和交换是不同的概念。您不能从其中之一对另一方进行任何扣除。
kmalloc()
和其他内核数据分配来自板坯/竹节等等。内核获取用户空间数据的同一位置。因此页面频繁地在内核数据段和用户空间之间移动。这是对的。它没有说任何关于交换的事情。这是一个单独的问题,你无法推断出任何东西。
内核代码通常在启动时填充并标记为只读,此后永远不会更改。因此物理页不在内核代码段和用户空间之间移动.
为什么你认为因为来自同一个池子的东西是相同的?网络套接字也来自同一个内存池。它是一个关注点分离. The linux-mm(内存管理系统)处理交换。可以固定页面(不可交换)。检查静态内核内存(这可能包括.bss and .data) 是一个简单的范围检查。内存通常被固定并标记为不可交换linux-mm层。用户数据(谁的分配来自同一个池)可以被标记为可交换linux-mm。例如,即使没有交换,用户空间文本仍然是可交换的,因为它由inode。对于只读数据来说,缓存要简单得多。如果数据被交换,则会在 MMU 表中进行标记,并且故障处理程序必须区分交换和SIGBUS;这是linux-mm.
还有一些 Linux 版本no-mm(或者没有 MMU)并且这些永远不会交换任何东西。理论上,有人可能能够交换内核数据;但事实并非如此。但为什么它在内核中呢? Linux 的方式是使用module并且仅根据需要加载它们。当然,linux-mmdata 是内核数据,希望您能看到交换它的问题。
像这样的概念性问题的问题,
- 它可能因 Linux 版本而异。
- 它可能因 Linux 配置而异。
- 该建议可能会随着 Linux 的发展而改变。
当然,linux-mm 代码不可交换,任何中断处理程序也不可交换。在某个时间点,内核代码和/或数据可能会被交换。我认为这不是模块加载/卸载之外的当前情况(并且对于您是否称其为相当迂腐/深奥)swapping或不)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)