ARM Linux:PTE不可写但很脏

时间:2016-02-11 16:39:22

标签: linux-kernel arm virtual-memory page-tables

我知道ARM体系结构通过在页面错误处理程序中设置它们来模拟Linux的年轻和脏标志,如here所述。但最近对于一个小二进制文件,我发现其中一个匿名段中的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段设置了此组合?这种组合意味着什么?任何指针都会有所帮助。提前谢谢。

1 个答案:

答案 0 :(得分:2)

  

我发现其中一个匿名片段中的Linux PTE设置为不可写 ...这种组合意味着什么?

TL; DR - 这只是意味着该页面不在后备存储中且它是只读的。

Dirty 只是意味着写入支持商店(swap,mmap文件或inode)。诸如代码之类的许多东西总是从文件中读取,因此它们由inode支持。

如果你mmap只有一些只读内存,那么你就可以得到这种组合。其他可能性是堆栈保护,分配器运行时缓冲区溢出检测和写时复制功能。

这些都不正常。对于典型的分配,您将获得由swap支持的内容,只有写入才会使页面变为 dirty 。所以案件可能不那么频繁但有效。

请参阅:ARM Linux PTE bits
ARM Linux emulate dirty/accessed

似乎没有关于年轻位意味着什么的文档。 young 是有关交换内容的信息。如果某些东西很年轻而且长时间没有进入,那么它是一个很好的选择。相比之下, dirty 是否需要交换需要。如果页面,则它尚未写入后备存储(交换文件或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.

不存在,脏似乎是一个不可能的条件,但脏和只读是有效的。