# define __flush_tlb_all()
do {
if (cpu_has_pge)
__flush_tlb_global();
else
__flush_tlb();
} while ( 0 )
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 )
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 )
" 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 )