我问,因为我记得所有属于内核的物理页面都固定在内存中,因此无法解决,就像这里所说的那样:http://www.cse.psu.edu/~axs53/spring01/linux/memory.ppt
然而,我正在阅读一篇研究论文并感到困惑,因为它说, "(物理)页面经常在内核数据段和用户空间之间移动。"
它还提到,相反,物理页面不会在内核代码段和用户空间之间移动。
我认为如果物理页面有时属于内核数据段并且有时属于用户空间,那么它必须意味着属于内核数据段的物理页面是可交换的,这违背了我目前的理解。
那么,属于内核数据段的物理页面是否可以交换? unswappable?
P.S。研究论文可在此处获得: https://www.cs.cmu.edu/~arvinds/pubs/secvisor.pdf
请搜索"在"之间移动你会发现的。
P.S。同样,从[3G + 896M]到4G的虚拟内存区域属于内核,用于在ZONE_HIGHMEM(x86 32位Linux,3G + 1G设置)中映射物理页面。在这种情况下,内核可以首先将该区域中的一些虚拟页面映射到托管当前进程的页面表的物理页面,修改一些页面表条目,以及取消映射虚拟页面。这样,物理页面有时可能属于内核,有时属于用户空间,因为它们在取消映射后不属于内核,因此变为可交换。这是什么原因?
答案 0 :(得分:4)
tl; dr - 内存池和交换是不同的概念。你不能从另一个中做出任何扣除。
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
public class DisbleButton extends JPanel {
private JTextField field = new JTextField(10);
private ButtonAction buttonAction = new ButtonAction();
private JButton button = new JButton(buttonAction);
public DisbleButton() {
add(field);
add(button);
buttonAction.setEnabled(false);
field.getDocument().addDocumentListener(new FieldDocListener());
}
private class FieldDocListener implements DocumentListener {
@Override
public void changedUpdate(DocumentEvent dEvt) {
testDoc(dEvt);
}
@Override
public void insertUpdate(DocumentEvent dEvt) {
testDoc(dEvt);
}
@Override
public void removeUpdate(DocumentEvent dEvt) {
testDoc(dEvt);
}
private void testDoc(DocumentEvent dEvt) {
Document doc = dEvt.getDocument();
buttonAction.setEnabled(doc.getLength() > 0);
}
}
private class ButtonAction extends AbstractAction {
public ButtonAction() {
super("Press Me");
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO do calculation here!
}
}
private static void createAndShowGui() {
DisbleButton mainPanel = new DisbleButton();
JFrame frame = new JFrame("DisbleButton");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
和其他内核数据分配来自 slab / slub 等。内核为用户空间获取数据的位置相同。 Ergo 页面经常在内核数据段和用户空间之间移动。这是对的。它没有说什么关于交换。这是一个单独的问题,你不能推断任何东西。
内核代码通常在引导时填充并标记为只读,之后永远不会更改。 Ergo 物理页面不会在内核代码段和用户空间之间移动。
为什么你认为因为某些东西来自同一个池,它是一样的?网络套接字也来自同一个内存池。这是一个关注的分离。 linux-mm (内存管理系统)处理交换。页面可以固定(不可退回)。检查静态内核内存(可能包括 .bss 和 .data )是一个简单的范围检查。内存通常在 linux-mm 层固定并标记为不可退回。 linux-mm 可以将用户数据(来自同一池的分配)标记为可交换。例如,即使没有交换,用户空间文本仍然可以交换,因为它由 inode 支持。对于只读数据,缓存更加简单。如果交换数据,则在MMU表中将其标记为,并且故障处理程序必须区分交换和 SIGBUS ;这是 linux-mm 的一部分。
还有 no-mm (或没有MMU)的Linux版本,这些版本永远不会交换任何内容。从理论上讲,有人可能会交换内核数据;但为什么它在内核中呢? Linux方式是使用模块,只根据需要加载它们。当然, linux-mm 数据是内核数据,希望你可以看到交换它的问题。
像这样的概念性问题的问题,
可以肯定的是,linux-mm代码不能交换,也不能用任何中断处理程序。在某个时间点,可能会交换内核代码和/或数据。我不认为这是模块加载/卸载之外的当前情况(对于你是否称之为交换而言,它是相当迂腐/深奥的。)
答案 1 :(得分:1)
我认为如果物理页面有时属于内核数据段并且有时属于用户空间,那么它必然意味着属于内核数据段的物理页面是可交换的,这违背了我目前的理解。强>
可交换内存与用户空间和内核空间之间的页面移动之间没有任何关联。页面是否可以交换完全取决于它是否被固定。固定页面不会被交换,因此它们的映射被认为是永久性的。
那么,属于内核数据段的物理页面是否可以交换? unswappable吗
内核使用的页面通常是固定的,因此意味着不能交换。
答案 2 :(得分:0)
然而,我正在阅读一篇研究论文并感到困惑,因为它说“(物理)页面经常在内核数据段和用户空间之间移动。”
您能否提供此research papaer
的链接?
就我所知,(仅来自UNIX讲座和学校实验室)内核空间的页面已经为内核分配,使用简单的固定映射算法,并且它们都被固定。在内核打开分页模式后,(CR0和CR3的位操作为x86)将有第一个用户模式进程,并且已经为内核分配的页面将不在用户空间的可用页面集中。 / p>