没有硬件支持的虚拟内存

时间:2014-09-16 11:14:30

标签: memory memory-management operating-system virtualization

在阅读this问题及其答案时,我无能为力,但想想为什么硬件必须支持虚拟内存?

例如我不能用软件模拟这种行为(例如,o.s表示所有内存作为某个表,拦截所有与内存相关的操作并自行进行映射)?

是否有任何操作系统可以实现此类技术?

1 个答案:

答案 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];
    }
}

(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的模拟代码有数百个机器代码,然后我们可以猜测这个内存访问代码&#39;速度至少会减慢数百倍。

此外,您只能观看 内存访问代码。您的处理器可能没有此功能,您应该使用逐步调试,例如x86的陷阱标记,并且每次都检查每个命令。

事情变得更糟 - 检查代码还不够。您可能希望IP(指令指针)也遵循操作系统的虚拟内存规则,因此您必须在每个代码运行后检查IP是否超出页面边界。您还必须非常谨慎地处理可以更改IP的代码,例如jmp, call, ret, ...

我认为它无法有效实施。 无法有效实施。速度是操作系统最重要的部分之一。如果操作系统变得有点慢,则所有系统都会受到影响。在这种情况下,它不是一点 - 您的计算机变慢很多很多。此外,正如我上面所说,实现这一点非常困难 - 我宁愿写一个处理器的仿真器,它具有硬件支持的虚拟内存,而不是这个疯狂的工作!