我知道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段设置了此组合?这种组合意味着什么?任何指针都会有所帮助。提前谢谢。
答案 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.
不存在,脏似乎是一个不可能的条件,但脏和只读是有效的。