在Linux中,属于内核数据段的物理内存页是否可交换?

在Linux中,属于内核数据段的物理内存页是否可交换?,linux,memory-management,linux-kernel,kernel,Linux,Memory Management,Linux Kernel,Kernel,我这样问是因为我记得所有属于内核的物理页面都被固定在内存中,因此是不可移动的,就像这里所说的: 然而,我正在读一篇研究论文,我感到困惑,因为它说, “(物理)页面经常在内核数据段和用户空间之间移动。” 它还提到,相比之下,物理页面不会在内核代码段和用户空间之间移动 我认为,如果一个物理页面有时属于内核数据段,有时属于用户空间,那一定意味着属于内核数据段的物理页面是可交换的,这与我目前的理解相反 那么,属于内核数据段的物理页面是否可以交换?不可拆卸的 另外,研究论文可在以下位置获得: 请搜索“移

我这样问是因为我记得所有属于内核的物理页面都被固定在内存中,因此是不可移动的,就像这里所说的:

然而,我正在读一篇研究论文,我感到困惑,因为它说, “(物理)页面经常在内核数据段和用户空间之间移动。”

它还提到,相比之下,物理页面不会在内核代码段和用户空间之间移动

我认为,如果一个物理页面有时属于内核数据段,有时属于用户空间,那一定意味着属于内核数据段的物理页面是可交换的,这与我目前的理解相反

那么,属于内核数据段的物理页面是否可以交换?不可拆卸的

另外,研究论文可在以下位置获得:

请搜索“移动范围”,您将找到它

另外,从[3G+896M]到4G的虚拟内存区域属于内核,用于映射ZONE_HIGHMEM中的物理页(x86 32位Linux,3G+1G设置)。在这种情况下,内核可能首先将该区域中的一些虚拟页面映射到承载当前进程的页面表的物理页面,修改一些页面表条目,并取消映射虚拟页面。这样,物理页面有时属于内核,有时属于用户空间,因为它们在取消映射后不属于内核,因此成为可交换的。这是原因吗

然而,我在读一篇研究论文时感到困惑,因为它说,“(物理)页面经常在内核数据段和用户空间之间移动。”

你能给我一个这个
research paper
的链接吗


据我所知,(仅在学校的UNIX讲座和实验室中),内核空间的页面已经分配给内核,使用了一个简单的固定映射算法,并且它们都是固定的。内核打开分页模式后,(x86的CR0和CR3的位操作)将有第一个用户模式进程,分配给内核的页面将不在用户空间的可用页面集中。

tl;dr-内存池和交换是不同的概念。你不能从其中一项中扣除另一项


kmalloc()
和其他内核数据分配来自slab/slub等。内核获取用户空间数据的位置相同。Ergo页面经常在内核数据段和用户空间之间移动。这是正确的。它没有说任何关于交换的内容。这是另一个问题,你不能推断出任何东西

内核代码通常在引导时填充,并标记为只读,此后再也不会更改。因此,物理页面不会在内核代码段和用户空间之间移动

为什么你认为,因为来自同一个池子的东西是一样的?网络套接字也来自同一内存池。这是一个独立的关注点。linux mm(内存管理系统)处理交换。页面可以固定(不可移动)。静态内核内存检查(可能包括.bss和.data)是一个简单的范围检查。内存通常在linux mm层固定并标记为不可移动。linux mm可以将用户数据(WHO分配来自同一池)标记为可交换。例如,即使没有交换,用户空间文本仍然是可交换的,因为它由inode支持。对于只读数据,缓存要简单得多。如果数据被交换,它在MMU表中被标记为交换,并且故障处理程序必须区分交换和SIGBUS;这是linux mm的一部分

还有一些版本的Linux没有mm(或没有MMU),它们永远不会交换任何东西。理论上,有人可能能够交换内核数据;但是为什么它在内核中呢?Linux的方法是使用模块,只在需要时加载它们。当然,LinuxMM数据是内核数据,希望您能看到交换该数据时出现的问题

像这样的概念性问题

  • 它可能与Linux版本不同
  • 它可能与Linux配置不同
  • 随着Linux的发展,建议可能会发生变化

  • 当然,linux mm代码不能交换,也不能使用任何中断处理程序。在某个时间点,内核代码和/或数据可能会被交换。我不认为这是模块加载/卸载之外的当前情况(关于是否称之为交换,这相当迂腐/深奥)。

    我认为如果物理页面有时属于内核数据段,有时属于用户空间,这一定意味着属于内核数据段的物理页面是可交换的,这与我目前的理解背道而驰。

    用户空间和内核空间之间的可交换内存和页面移动之间没有联系。页面是否可以交换完全取决于它是否被固定。固定页面不会交换,因此其映射被视为永久性的

    那么,属于内核数据段的物理页面是否可以交换?不可拆卸?


    通常内核使用的页面是固定的,因此不可交换。

    这里有一个链接可能很有用:我在论文中添加了一个链接。感谢您提供xv6内存参考:)提供链接或准确的完整引用我在论文中添加了一个链接。我认为kmalloc()只会在1GB内核区域(对于x86平台)分配内存,而不会存储任何用户数据。你说“内核获取用户空间数据的地方。”这是什么意思?你是说1GB内核区域中的一些内存可能属于用户级应用程序?1GB是一个虚拟地址。我指的是可以分配给任何虚拟地址的物理内存页(和地址/池)。