这问题回答有关如何查找缓存的一部分的问题。但是,在fincore
可执行文件中,您必须传递文件名来检查它是否是缓存的一部分。
是否有一种工具或方法可以在不传递文件名的情况下查找属于缓存内存的所有条目。
PS:我们在嵌入式系统中运行它,运行 for 循环并将所有文件传递给fincore
自身是一个更耗时和消耗内存的过程。因此,我正在寻找其他方法。
答案1
我不知道内核在哪里公开与其缓存的块关联的文件名。根据这个答案
https://stackoverflow.com/a/4941371
即使使用自定义内核模块,您也能做的最好的事情就是获取索引节点和设备的列表。从那里您可能仍然需要在文件系统中查找这些文件。
然后您可能会问“但是,如何fincore
知道我列出的文件呢?”或者你可能不知道,但我发现这个方法非常聪明,所以就在这里。该fincore
工具通过执行以下操作来工作:
- 呼叫映射(2)在给定的文件上(https://code.google.com/p/linux-ftools/source/browse/linux-fincore.c#260)
- 呼叫最小核心(2)在 mmap 返回的内存区域上(https://code.google.com/p/linux-ftools/source/browse/linux-fincore.c#279)
系统mincore
调用告诉您给定的内存页面是否在核心内存中(即访问时不会导致页面错误)。由于mmap
延迟加载映射文件,并且我们还没有读取任何映射区域,因此任何页面不会导致页面错误的原因必须是我们的缓存的一部分。