ARM Linux: PTE不可写但脏页

3

我知道ARM架构通过在页面故障处理程序中设置它们来仿真Linux的年轻和脏标志,如此处所讨论的。但最近,在一个小型二进制文件中,我观察到匿名段中的一个Linux PTE被设置为不可写脏的。观察到了以下Linux PTE状态:

- L_PTE_PRESENT : 1
- L_PTE_YOUNG   : 1 
- L_PTE_DIRTY   : 1
- L_PTE_RDONLY  : 1
- L_PTE_XN      : 0

我找不到关于这组 PTE 标志的解释。内核是否为特殊的匿名 VMA 段设置了这种组合?这个组合代表什么意思?任何指针都会有帮助。提前感谢。


我在问题中提出的建议是该页面“脏”且“不可写”。我的问题是:“一个不允许写入的页面如何被标记为脏?这可能意味着有人已经写入了它?” 该二进制文件只是分叉一个子进程并在进入永久循环之前分配堆区域。 - jada12276
嗯...这对我来说是新的。我认为“脏”位表示页面内容与二级存储不一致,驱逐该页面需要执行写回操作。相反,“年轻”位是我认为用于决定是否驱逐页面(基于LRU算法)。我从这本书的“页面帧回收”章节中得到了这些想法。 - jada12276
所以,我无法理解你的这个陈述: “Dirty”表示它不在二级存储器中,并且是从主内存中驱逐的候选项。这并不意味着有人一定写入了它。 我是一个Linux内核的新手,如果我问了一些愚蠢的问题,请多多包涵。感谢这次讨论。 - jada12276
啊哈,所以一个页面是否可写并不重要。如果内核知道它无法从交换空间或inode中恢复该页面,则会将其标记为脏页。而且只有在没有其他选择时,页面回收器才会将它们移动到交换空间。非常感谢您的解释! - jada12276
1个回答

3
我注意到匿名段中的Linux PTE被设置为不可写。这种组合意味着什么?
简而言之,这只是意味着该页面不在后备存储器中,并且是只读的。
“脏”只是意味着没有写入到后备存储器(交换、mmap文件或inode)中。许多东西,如代码,总是从文件中读取,因此它们由一个inode支持。
如果您mmap一些只读内存,那么您可能会得到这种组合,例如。其他可能性包括堆栈保护、分配器运行时缓冲区溢出检测和写时复制功能。
这些都不是正常情况。对于典型的分配,您将拥有一些由交换支持的内容,只有写操作才会使页面变为。因此,这种情况可能不太频繁,但是有效的。
参见:ARM Linux PTE bits
        ARM Linux emulate dirty/accessed 关于“年轻”的含义似乎很少有文献资料。年轻是关于交换什么的信息。如果某些内容长时间未被访问且年轻,它是一个很好的替换候选项。相反,“脏”是指是否需要进行交换。如果页面是“脏”的,则尚未写入后备存储器(交换文件或mmap文件等)。分页程序必须写出此页面。如果它不是脏的(或干净的),则分页程序可以简单地丢弃内存并重新使用。 年轻之间的区别就像应该必须
- L_PTE_PRESENT : 1   - it has physical RAM (not swapped)
- L_PTE_YOUNG   : 1   - is has not been used
- L_PTE_DIRTY   : 1   - it is different than backing store
- L_PTE_RDONLY  : 1   - user space can not write.
- L_PTE_XN      : 0   - code can execute.

"不存在且脏乱"似乎是一个不可能的情况,但"脏乱且只读"是合法的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接