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

时间:2011-07-23 22:39:55

标签: memory-management x86 x86-64 tlb mmu

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

2 个答案:

答案 0 :(得分:4)

Linux内核没有这样的转储器,linux内核有关于缓存和tlb的页面:https://www.kernel.org/doc/Documentation/cachetlb.txt“Linux下的缓存和TLB刷新”。大卫·米勒

在80386DX中有一个这样的TLB转储(和80486,可能在1998年的“嵌入式奔腾”100-166 MHz /“Embedded Pentium MMX 200-233 MHz”):

  • 1 - 书“MICROPROCESSORS:THE 8086 / 8088,80186 / 80286,80386 / 80486和PENTIUM FAMILY”,ISBN 9788120339422,2010,第579页

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

  • 2 - Godse& Godse的书“微处理器和微控制器”,2008 ISBN 9788184312973页面SA3-PA19:“3.2.7.3测试寄存器”“目前仅定义了两个测试寄存器(TR6-TR7)。 ...这些寄存器用于检查寻呼单元的转换后备缓冲器(TLB)。“
  • 3“x86-Programmierung und -Betriebsarten(Teil 5).Die Testregister TR6 und TR7”,关于寄存器的deutsche文章:“ZurPrüfungdesTranslation-Lookaside-Buffers sind die zwei Testregister TR6 und TR7 vorhanden。 Sie werden als Test-Command-Register(TR6)und Testdatenregister(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

答案 1 :(得分:1)

您可以获取存储在TLB中的VA-PA翻译列表,但您可能必须使用像qemu这样的处理器模拟器。您可以从http://wiki.qemu.org/Main_Page下载并安装qemu 您可以引导存储在磁盘映像中的内核(通常为qcow2或原始格式)并运行您的应用程序。您可能需要调整qemu中的代码来打印TLB的内容。查看tlb_*中的qemu/exec.c函数您可能需要添加tlb_dump_function来打印TLB的内容。据我所知,这是最接近倾倒TLB内容的方法。

P.S:我开始回答这个问题然后意识到它已经有一年了。