据我所知,No.
intercept all memory related actions
?这看起来并非不可能,但我必须这样做非常非常 slow.
例如,假设这段代码:
int f(int *a1, int *b1, int *c1, int *d1)
{
const int n=100000;
for(int j=0;j<n;j++){
a1[j] += b1[j];
c1[j] += d1[j];
}
}
(从这里>o https://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than-two-loops
这个简单的循环被编译为以下内容gcc -std=c99 -O3
与海湾合作委员会4.8.3:
push %edi ; 1
xor %eax,%eax
push %esi ; 2
push %ebx ; 3
mov 0x10(%esp),%ecx ; 4
mov 0x14(%esp),%esi ; 5
mov 0x18(%esp),%edx ; 6
mov 0x1c(%esp),%ebx ; 7
mov (%esi,%eax,4),%edi ; 8
add %edi,(%ecx,%eax,4) ; 9
mov (%ebx,%eax,4),%edi ; 10
add %edi,(%edx,%eax,4) ; 11
add $0x1,%eax
cmp $0x186a0,%eax
jne 15 <_f+0x15> ; 12
pop %ebx ; 13
pop %esi ; 14
pop %edi ; 15
ret ; 16
即使这个非常非常简单的功能16访问内存的机器代码。大概OS的模拟代码有数百个机器代码,那么我们可以猜测这些访问内存的代码的速度至少会减慢数百倍。
而且,正是你可以观看的时候only内存访问代码。可能您的处理器没有此功能,您应该使用逐步调试,例如 x86 的 Trap Flag,并检查every每次都发出命令。
事情变得更糟 - 仅检查代码是不够的。您可能希望IP(指令指针)也遵循操作系统的虚拟内存规则,因此您必须在每个代码运行后检查IP是否超出页面边界。你还必须很小心处理可以改变IP的代码,例如jmp, call, ret, ...
我认为它无法有效实施。无法有效实施。速度是操作系统最重要的部分之一。如果操作系统变得有点慢,所有系统都会受到影响。在这种情况下,它不是a bit- 你的电脑变慢许许多多。此外,正如我上面所说,实现这一点非常困难 - 我宁愿编写一个具有硬件支持虚拟内存的处理器模拟器,也不愿做这项疯狂的工作!