使TLB的所有项失效 --- __flush_tlb_all()

来源:互联网 发布:mac预览全屏快捷键 编辑:程序博客网 时间:2024/06/17 05:12
# define __flush_tlb_all()              
    
do {                                
        
if (cpu_has_pge)                
            __flush_tlb_global();       
        
else                            
            __flush_tlb();              
    }
 while (0)

刷新控制寄存器%%cr3为0, TLB中的所有项将自动失效
#define __flush_tlb()                           
    
do {                                    
        unsigned 
int tmpreg;                    
        __asm__ __volatile__(                   
            
"movl %%cr3, %0;               "   
            
"movl %0, %%cr3;  # flush TLB  "   
            : 
"=r" (tmpreg)                     
            :: 
"memory");                       
    }
 while (0)

插入C代码中的一个汇编语言代码片段可以分成四部分,以":"号加以分隔,其一般形式为:
    指令部分 : 输出部分 : 输入部分 : 损坏部分
  • 在损坏部分常常以"memory"为约束条件,表示操作完成以后内存中的内容已经改变,如果原来某个寄存器的内容来自内存,则现在可能已经不一致了(寄存器中是最新值;内存中是原有值)
  • 表示约束条件的字母很多,主要有:
"m""v" 和"o"            表示内存单元
"r"                       表示任何寄存器
"q"                       表示寄存器eax, ebx, ecx, edx之一
"i""h"                   表示直接操作数
"E""F"                   表示浮点数
"g"                     表示"任意"
"a"、 "b"、 "c"、 "d"    分别表示要求使用寄存器eax, ebx, ecx或edx
"S"、 "D"                分别表示要求使用寄存器esi或edi
"I"                        表示常数(0~31
                






 
原创粉丝点击