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