X86 调用invlpg指令时出现SEGFULT

X86 调用invlpg指令时出现SEGFULT,x86,segmentation-fault,tlb,X86,Segmentation Fault,Tlb,我正在尝试实现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刷新功能。对于刷新,我使用
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);
}

发生SIGSEGV是因为INVPG是一条特权指令,只能在内核代码外调用。 这意味着您不能以这种方式将用户空间页面逐出TLB。 然而,我编写了一个小内核模块来演示invlpg的用法:

invlpg
是一条特权指令。它只能从内核端代码执行。谢谢,我在规范中遗漏了这一点。那么,从用户空间刷新tlb的最自然的方法是什么(我需要它来进行基准测试)?开发内核模块?@Alexander AFAIK你需要为此开发一个内核模块。我需要相同的函数(用于压力测试)。是否有一个内核模块已经这样做了(使TLB缓存失效),并且可以从用户模式中删除?