2

我正在尝试实现 tlb 刷新功能。对于刷新,我使用INVLPG指令,但不幸的是它总是会导致分段错误。你能帮我解决这个问题吗?

这是代码:

#include "stdlib.h"

inline void tlb_flush_entry(int *m) 
{
    asm volatile ("invlpg %0"::"m"(*m):"memory");
}

int main(int argc, char **argv)
{
    int *memory = (int *)malloc(100);
    tlb_flush_entry(memory);
}
4

1 回答 1

1

发生 SIGSEGV 是因为 INVLPG 是特权指令,只能从内核代码中调用。这意味着您不能以这种方式将用户空间页面逐出 TLB。但是我写了一个小内核模块来演示 invlpg 的用法: 如何在 x86-64 架构上使用 INVLPG?

于 2016-06-11T07:12:31.270 回答