memory - 无硬件支持的虚拟内存

标签 memory memory-management operating-system virtualization

阅读时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/

相关文章:

multithreading - 线程 : Why must all user threads be mapped to a kernel thread?

c - 在 C 中获取操作系统的默认颜色

java - IntelliJ 2016.3.3 (32b) JVM 错误代码-6

c++ - 超出 DirectX11 视频内存

memory-management - 读取指令可能导致的页面错误的最大数量?

C++:删除动态分配的类时,不在堆上的私有(private)成员也会被删除吗?

.net - Windows 操作系统架构书

c - 即使我释放了每个 malloc,动态结构数组和链表中的内存泄漏

c# - 如何在另一个进程内存中的任何位置添加(而不是编辑)字节

ios - 为委托(delegate)保留和释放对象