0

所有可能更改的统计信息(端口标志 regs 中断异常等)并将其写入数组(以查看和比较)。它计算 opcode ...etc 的长度。

可能存在这样的标准测试,例如测试任何给定的处理器。并且没有特别需要未记录功能的“神奇发现”,您可以在网上找到它们。

4

1 回答 1

4

您没有提及您要定位的处理器类型。这个答案是从 x86 的角度来看的,但在其他架构中,这个任务可能也很相似。

首先,什么会限制你编写和运行这样的程序?如果您在计算机上具有 root 访问权限(可以在 x86 术语中运行 ring0 代码),您可以执行以下操作:

  1. 钩住所有必要的中断(或者你可以钩住所有的中断)。
  2. 生成指令。
  3. 将指令代码写入内存(可能有不同的指令长度)。
  4. 在指令之后写一个jmp, call, intor int3(在 x86 处理器中,在其他体系结构中,指令会有所不同)。
  5. 跳转到指令,它被执行或导致中断。如果它被执行,在它之后你会跳转或调用处理代码。如果它导致中断,请cs:ip从堆栈中检查(以了解指令在哪个地址失败),您处于哪个中断等,然后跳转或调用处理代码。

然后,在处理代码中,将您想要的所有数据(至少所有寄存器,我想)发送到某个外部端口,然后在另一台计算机上将所有数据存储在磁盘上。

  1. 然后生成下一条指令。
  2. 除非您已经处理了所有指令,否则跳至 3。

但是,在 x86 的情况下,允许的最大指令长度为 15 个字节。256^15 = 1.33 * 10^36。宇宙的年龄约为 4.339 * 10^17 秒。假设一个 10.0 GHz 处理器具有单核,每个时钟恰好 1 条指令(尝试并报告它),您将需要超过 300 000 000 个这样的处理器才能在比当前时代更短的时间内测试所有 15 字节指令宇宙:

(256^15)/(10*10^9)/(4.339*10^17) = 306344317

当然,您也需要相当多的存储空间。

于 2012-12-27T18:41:54.923 回答