阅读时this问题及其答案 我不禁思考为什么硬件必须支持虚拟内存?
例如,我不能仅使用软件来模拟这种行为(例如,将所有内存表示为某个表的操作系统,拦截所有与内存相关的操作并自行进行映射)?
有没有实现这种技术的操作系统?
最佳答案
据我所知,否 .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];
}
}
(From here >o<)
这个简单的循环被
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的模拟代码有上百个机器码,那么我们可以猜测这个内存访问代码的速度至少会慢上百倍。
此外,这是您只能观看内存访问代码的时候。可能你的处理器没有这个功能,你应该使用逐步调试,比如 x86 的 Trap Flag,并且每次都检查每个命令。
事情变得更糟 - 检查代码是不够的。您可能希望 IP(指令指针)也遵循操作系统的虚拟内存规则,因此您必须在每个代码运行后检查 IP 是否超出页面边界。您还必须非常小心地处理可以更改IP 的代码,例如
jmp, call, ret, ...
我不认为它可以有效地实现。 它无法有效实现。 速度是操作系统最重要的部分之一。如果操作系统变得有点慢,所有系统都会受到影响。在这种情况下,不是一点点-您的计算机变慢很多很多 .此外,正如我上面所说,实现这一点非常困难 - 我宁愿编写一个具有硬件支持的虚拟内存的处理器的模拟器,也不愿做这项疯狂的工作!
关于memory - 无硬件支持的虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25867304/