转储x86 CPU的TLB缓冲区的内容

osg*_*sgx 2 x86 memory-management x86-64 tlb mmu

是否可以从TLB(翻译后备缓冲区,这是CPU中的特殊缓存)获取翻译列表(从虚拟页面到物理页面)。我的意思是现代的x86或x86_64;我想以编程的方式做到这一点,而不是通过使用JTAG并将所有TLB条目移出。

osg*_*sgx 5

linux内核没有这样的转储程序,linux内核中有关于缓存和tlb的页面: https “ Linux下的缓存和TLB刷新”。戴维·米勒

在80386DX(和80486,甚至在“嵌入式​​奔腾”中100-166 MHz /在1998年的嵌入式奔腾MMX 200-233 MHz”中):

  • 1个预订“微处理机:8086 / 8088、80186 / 80286、80386 / 80486和奔腾系列”,ISBN 9788120339422,2010年,第579页

这是通过测试寄存器TR6 TR7完成的:

  • 2 -Godse&Godse的“微处理器和微控制器”书,2008 ISBN 9788184312973页SA3-PA19:“ 3.2.7.3测试寄存器”“目前仅定义了两个测试寄存器(TR6-TR7)。...这些寄存器用于检查翻译分页单元的后备缓冲区(TLB)。”
  • 3 “ x86-Programmierung和-Betriebsarten(Teil 5)。死于Testregister TR6和TR7”,关于寄存器的德国文章:“ ZurPrüfungdes Translation-Lookaside-Buffers zwei Testregister TR6和TR7vorhanden。Siewerdenals Test-Command-注册(TR6)和测试日期注册(TR7)bezeichnet。
  • 4英特尔的“嵌入式奔腾®处理器家族开发人员手册”,第26部分“特定于模型的寄存器和功能”,第8页“ 26.2.1.2 TLB测试寄存器”

TR6是命令寄存器,将线性地址写入其中。它可用于写入TLB或从TLB读取行。TR7是要写入TLB或从TLB读取的数据。

维基百科说 https://en.wikipedia.org/wiki/Test_register中,读取TR6 / TR7“在任何版本高于80486的CPU上生成无效的操作码异常”。

mov tr6 / tr7的编码仅在特权级别0可用:http ://www.fermimn.gov.it/linux/quarta/x86/movrs.htm

0F 24 /r    movl tr6/tr7,r32    12  Move (test register) to (register)  
   movl %tr6,%ebx
   movl %tr7,%ebx
0F 26 /r    movl r32,tr6/tr7    12  Move (register) to (test register)  
   movl %ebx,%tr6
   movl %ebx,%tr7
Run Code Online (Sandbox Code Playgroud)