2011-07-23 20 views
2

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

+0

当您的代码运行时,它通常会更改TLB的内容。你会如何避免这种情况? –

+0

TLB倾倒应该小一点,以改变TLB。对于不完全关联的TLB,还有一些银行方法(由OS协助)使应用程序TLB不与TLB转储工具的TLB(如页面着色)相交。 – osgx

回答

2

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

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

  • 1 - 书 “微处理器:8086/8088,八万〇二百八十六分之八万〇一百八十六,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 und -Betriebsarten(Teil 5)。 Die Testregister TR6 und TR7“,deutsche有关寄存器的文章:”ZurPrüfungdes Translation-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上。“

编码o ˚FMOV TR6/TR 7只提供给特权级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 
0

您可以获取存储在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:我开始回答这个问题,然后意识到它已经一岁了。

+0

但这仍然很有趣。哪个TLB由qemu模拟?您对使用Bochs或PTLsim仿真器有什么看法? – osgx

+0

你是指什么TLB? 'qemu'是一个处理器模拟器,可以模拟x86-64,sparc或其他类型的CPU。我没有使用Bochs,但最新版本的PTLsim使用'qemu'来执行功能仿真。 PTLSim用于模拟时间信息。 – Bhushan

+0

Bhushan,什么是模拟TLB的参数? – osgx