# 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)
本文详细介绍了TLB刷新的不同方式,包括全局刷新和局部刷新,并提供了具体的汇编语言实现细节。此外,还解释了如何通过修改控制寄存器来使TLB中的所有条目失效。
2324

被折叠的 条评论
为什么被折叠?



