调用invlpg指令时的Segfault

时间:2012-11-06 14:49:47

标签: x86 segmentation-fault tlb

我正在尝试实现tlb flush功能。对于刷新我使用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);
}

1 个答案:

答案 0 :(得分:1)

SIGSEGV的发生是因为INVLPG是一个特权指令,只能从内核代码中调用。 这意味着您无法以这种方式从TLB中驱逐用户空间页面。 但是我写了一个litte内核模块来演示invlpg的用法: How to use INVLPG on x86-64 architecture?