是否可以从TLB(翻译后备缓冲区,这是CPU中的特殊缓存)获取翻译列表(从虚拟页面到物理页面)。我的意思是现代x86或x86_64;我想以编程方式完成它,而不是使用JTAG并将所有TLB条目移出。
答案 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”):
这是通过测试寄存器TR6 TR7完成的:
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内容的方法。