跟踪页面 table 对 Linux 进程的访问

Trace page table access of a Linux process

我写信询问是否可以跟踪一个普通Linux用户的页面table访问(根据每个页面table访问的"index")应用。基本上,我所做的是重现这篇研究文章中提到的利用(https://www.ieee-security.org/TC/SP2015/papers-archived/6949a640.pdf)。特别是,数据页面访问需要被记录以用于程序秘密的使用和推断。

我了解Linux系统,64位x86架构,页面table大小为4K。我已经使用 pin (https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool) 来记录所有虚拟内存访问的地址跟踪。那么我可以简单地计算每个数据页table访问的"index",用下面的翻译规则吗?

index = address >> 15 

4KB = 2 ^ 15。这是正确的吗?预先感谢您提出任何建议或意见。

此外,我想我想指出的一件事是,从概念上讲,我不需要每个数据页的 "precise" 标识符 table ID,而只需要一个数字 ("index")区分不同数据页的访问。与他们的攻击相比,这将提供概念上相同数量的信息。

好的,所以你真的不需要 "index",只需要一些唯一的标识符来区分进程虚拟地址中的不同页面。

这种情况下,就address >> PAGE_SHIFT就行了。在具有 4KB 页面的 x86 中 PAGE_SHIFT is 12,因此您可以:

page_id = address >> 12

然后如果 address1address2 对应于同一页,则两个地址的 page_id 将相同。

或者,要获得相同的结果,您可以执行 address & PAGE_MASK,其中 PAGE_MASK 只是 0xfffffffffffff000(即 ~((1UL << PAGE_SHIFT) - 1))。