我正在尝试测量内存访问时间,并需要减少由TLB命中和未命中产生的噪声。
为了清除TLB中的特定页面,我尝试使用INVLPG指令,按照以下两个示例:http://wiki.osdev.org/Paging 和 http://wiki.osdev.org/Inline_Assembly/Examples 我编写了以下代码:
如果我理解正确,invlpg将使用RDI的字节值调用,但实际上需要一个QWORD地址。
然而第二个链接说:"m指针指向逻辑地址,而不是物理或虚拟地址:ds段的偏移量"
那么INVLPG需要来自ds段的偏移量吗?但在AMD64中不再使用ds段,是吗?
有人能解释一下如何在AMD64上使用INVLPG指令或如何驱逐TLB条目吗?
为了清除TLB中的特定页面,我尝试使用INVLPG指令,按照以下两个示例:http://wiki.osdev.org/Paging 和 http://wiki.osdev.org/Inline_Assembly/Examples 我编写了以下代码:
static inline void __native_flush_tlb_single(unsigned long addr)
{
asm volatile("invlpg (%0)" ::"r" (addr) : "memory");
}
但是生成的二进制文件在执行时会抛出SIGSEGV错误。 由于我更喜欢使用Intel语法,所以我查看了特定的反汇编代码:
invlpg BYTE PTR [rdi]
如果我理解正确,invlpg将使用RDI的字节值调用,但实际上需要一个QWORD地址。
然而第二个链接说:"m指针指向逻辑地址,而不是物理或虚拟地址:ds段的偏移量"
那么INVLPG需要来自ds段的偏移量吗?但在AMD64中不再使用ds段,是吗?
有人能解释一下如何在AMD64上使用INVLPG指令或如何驱逐TLB条目吗?