我正在尝试实现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);
}
答案 0 :(得分:1)
SIGSEGV的发生是因为INVLPG是一个特权指令,只能从内核代码中调用。 这意味着您无法以这种方式从TLB中驱逐用户空间页面。 但是我写了一个litte内核模块来演示invlpg的用法: How to use INVLPG on x86-64 architecture?