在阅读this问题及其答案时,我无能为力,但想想为什么硬件必须支持虚拟内存?
例如我不能用软件模拟这种行为(例如,o.s表示所有内存作为某个表,拦截所有与内存相关的操作并自行进行映射)?
是否有任何操作系统可以实现此类技术?
答案 0 :(得分:2)
据我所知,否。
intercept all memory related actions
?它看起来不可能,但我必须非常慢。
例如,假设此代码:
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];
}
}
这个简单的循环由gcc -std=c99 -O3
和gcc 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的模拟代码有数百个机器代码,然后我们可以猜测这个内存访问代码&#39;速度至少会减慢数百倍。
此外,您只能观看 内存访问代码。您的处理器可能没有此功能,您应该使用逐步调试,例如x86的陷阱标记,并且每次都检查每个命令。
事情变得更糟 - 检查代码还不够。您可能希望IP(指令指针)也遵循操作系统的虚拟内存规则,因此您必须在每个代码运行后检查IP是否超出页面边界。您还必须非常谨慎地处理可以更改IP的代码,例如jmp, call, ret, ...
我认为它无法有效实施。 无法有效实施。速度是操作系统最重要的部分之一。如果操作系统变得有点慢,则所有系统都会受到影响。在这种情况下,它不是一点 - 您的计算机变慢很多很多。此外,正如我上面所说,实现这一点非常困难 - 我宁愿写一个处理器的仿真器,它具有硬件支持的虚拟内存,而不是这个疯狂的工作!