zVlad wrote: - все команды позволяющие приложению влиять на супервизор должны быть привелигированными и попытка их выполнения должна вызывать аппаратное прерывание. Для случая многопользовательности это требование усиливается тем команды позволяющии приложению влиять на другие приложения тоже должны быть привелигированными.
Вот тут то и ошибка
Того что вы написали НЕДОСТАТОЧНО для виртуализируемости
Для виртуализируемости еще дополнительно нужно, чтобы команды, которые позволяли процессу УЗНАВАТЬ (только узнавать, а не влиять) чтото за пределами своей песочницы, также были привилегированными
То есть добавив к командам IBM только одну: узнать моду процессора (0-ядро, 1-user. Я упрощаю, наверное их больше) сразу превратит процессор IBM в невиртуализируемый (без гемора).
Корректная реализация этой команды должна быть таклй: в режиме ядра она действительно выдает 0, а в режиме user генерит прерывание, что позволяет сымитировать как выдачу нуля, так и единицы.
Вообще в той статье, которую Вы же и приводили, все разжевано детально
Чтобы еще раз уточнить свою мысль то разработчики всегда думали о
zVlad wrote:- области памяти супервизора не могут быть доступны приложению для изменения, а лишь для чтения. Должна быть также возможность полного изолирования памяти супервизора от приложения. Нарушение должно вызывать аппаратное прерывание. В случае многопользовательности это требование усиливается тем что приложения не могут иметь доступа в памяти других приложений.
и тщательно за этим следили, но забывали, что для того, чтобы поставить подножку виртуализации, достаточно разрешить читать всего лишь некоторые слова состояния процессора, более того, как в примере выше, разрешив читать 1 (один) бит (user mode/kernel mode)