2

При чтении this вопрос и его ответ Я не мог не подумать, почему это обязательно для аппаратного обеспечения для поддержки виртуальной памяти?Виртуальная память без аппаратной поддержки

Например, не могу ли я имитировать это поведение только с программным обеспечением (например, o.s с изображением всей памяти в виде таблицы, перехватывать все связанные с памятью действия и выполнять само отображение)?

Есть ли какая-либо ОС, которая реализует такие методы?

+0

для большинства процессоров, mmu - это то, что сообщает os о доступе к памяти. если он не поддерживает виртуальную память, вы, вероятно, не сможете реализовать его в программном обеспечении, не перекомпилируя весь код с помощью специального компилятора. это также будет очень медленным. (например, на 2 - 10 раз медленнее) – programmerjake

+0

Как и @programmerjake, это было бы ужасно медленно. Фактически, ваш «менеджер программного обеспечения» превратил процессор в интерпретатор. Аппаратное обеспечение MMU позволяет процессору запускать исполняемый код изначально до тех пор, пока аппаратное обеспечение и обработка не будут вызваны прерыванием ошибки страницы. –

+0

@programmerjake Я пытаюсь понять, возможно ли, я хорошо знаю, что это может замедлить работу. Почему вы думаете, что мне нужно перекомпилировать все?Например, я мог бы написать что-то вроде эмулятора, который будет переводить двоичный файл в реальном времени, не так ли? (Опять же, я не беспокоюсь о скорости) – Darius

ответ

2

Насколько я знаю, No.

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 

Даже это действительно очень просто функция имеет машинные коды, которые получают доступ к памяти. Вероятно, код симуляции ОС содержит сотни машинных кодов. Тогда мы можем догадаться, что скорость доступа к кодам памяти будет замедляться как минимум в сотни раз.

Кроме того, это когда вы можете посмотреть только Коды доступа к памяти. Вероятно, у вашего процессора нет этой функции, вы должны использовать пошаговую отладку, например, флаг ловушки x86, и проверять каждую команду каждый раз.

Все ухудшается - недостаточно проверить коды. Вы можете захотеть, чтобы IP (указатель инструкций) соответствовал правилу виртуальной памяти вашей ОС, поэтому вы должны проверить, превышает ли IP границу страницы после запуска каждого кода. Вы также должны очень осторожно иметь дело с кодами, которые могут изменить IP, например jmp, call, ret, ...

Не думаю, что это может быть эффективно реализовано. Он не может быть эффективно реализован. Скорость - одна из важнейших частей операционной системы. Если ОС станет немного медленным, все системы будут затронуты. В этом случае это не бит - ваш компьютер замедляется лотов и лотов. Более того, реализация этого очень сложна, как я сказал выше - я бы предпочел написать эмулятор процессора, который имеет аппаратную поддержку виртуальной памяти, чем эту сумасшедшую работу!

+0

Да, и не предлагайте мне работа либо :) –

+0

Фраза немного запутанная, кажется, что обе делают эту «сумасшедшую работу» (как вы ее назовете :)) и эмулируете весь процессор, выполнит обсуждаемую цель. Так почему смелый ** Нет **? Похоже, это должно быть «Да, но это будет медленно, как черт». (или медленный как эмулятор, который не совсем отличается) – Darius

+0

@Darius снова прочитал мой последний абзац (или вы прочитали отредактированную версию> o <) Скорость будет ужасной, и OS не должна делать. – ikh

Смежные вопросы