# 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 )