2012-11-06 37 views
2

我試圖實現tlb刷新功能。對於沖洗我使用INVLPG指令,但不幸的是,它總是會導致分段錯誤。你能幫我解決這個問題嗎?當調用invlpg指令時出現Segfault

下面是代碼:

#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); 
} 
+5

'invlpg'是一條特權指令。它只能從內核端代碼執行。 – James

+1

謝謝,我錯過了這個規範。那麼什麼是從用戶空間刷新tlb的最自然的方式(我需要它來進行基準測試)?開發內核模塊? – Alexander

+0

@Alexander AFAIK您需要爲此開發一個內核模塊。 – Powerslave

回答

1

的SIGSEGV是因爲INVLPG是特權指令,只能叫出來的內核代碼。 這意味着你不能以這種方式從TLB中驅逐一個用戶空間頁面。 但是我寫了一個litte內核模塊,演示了使用invlpg: How to use INVLPG on x86-64 architecture?

相關問題