2

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

4

2 回答 2

5

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

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

  • 1 - 书籍“微处理器:8086/8088、80186/80286、80386/80486 和奔腾系列”,ISBN 9788120339422,2010,第 579 页

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

  • 2 - Godse&Godse 所著的《Microprocessors & Microcontrollers》一书,2008 ISBN 9788184312973 页 SA3-PA19:“3.2.7.3 测试寄存器”“目前只定义了两个测试寄存器(TR6-TR7)。......这些寄存器用于检查翻译分页单元的后备缓冲区 (TLB)。”
  • 3 “x86-Programmierung und -Betriebsarten (Teil 5). Die Testregister TR6 und TR7”,关于寄存器的德国文章:“Zur Prüfung des Translation-Lookaside-Buffers sind die zwei Testregister TR6 und TR7 vorhanden. Sie werden als Test-Command-注册 (TR6) 和测试数据注册 (TR7) bezeichnet。"
  • 4 Intel 的“Embedded Pentium® Processor Family Developer's Manual”,部分“26 Model Specific Registers and Functions”第 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
于 2011-08-28T00:17:21.930 回答
1

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

PS:我开始回答这个问题,然后意识到它已经一岁了。

于 2012-10-07T04:46:22.117 回答