Насколько я знаю, 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, ...
Не думаю, что это может быть эффективно реализовано. Он не может быть эффективно реализован. Скорость - одна из важнейших частей операционной системы. Если ОС станет немного медленным, все системы будут затронуты. В этом случае это не бит - ваш компьютер замедляется лотов и лотов. Более того, реализация этого очень сложна, как я сказал выше - я бы предпочел написать эмулятор процессора, который имеет аппаратную поддержку виртуальной памяти, чем эту сумасшедшую работу!
для большинства процессоров, mmu - это то, что сообщает os о доступе к памяти. если он не поддерживает виртуальную память, вы, вероятно, не сможете реализовать его в программном обеспечении, не перекомпилируя весь код с помощью специального компилятора. это также будет очень медленным. (например, на 2 - 10 раз медленнее) – programmerjake
Как и @programmerjake, это было бы ужасно медленно. Фактически, ваш «менеджер программного обеспечения» превратил процессор в интерпретатор. Аппаратное обеспечение MMU позволяет процессору запускать исполняемый код изначально до тех пор, пока аппаратное обеспечение и обработка не будут вызваны прерыванием ошибки страницы. –
@programmerjake Я пытаюсь понять, возможно ли, я хорошо знаю, что это может замедлить работу. Почему вы думаете, что мне нужно перекомпилировать все?Например, я мог бы написать что-то вроде эмулятора, который будет переводить двоичный файл в реальном времени, не так ли? (Опять же, я не беспокоюсь о скорости) – Darius