Но 16-разрядный код может быть вызван из 32-разрядного для каких-то действий в интересах 32-разрядного кода. Когда взаимодействие 32-разрядного и 16-разрядного кода идёт только через регистры - всё достаточно просто. А как должен выглядеть (например) вызов 16-разрядной функции STRLEN, получающей в R0 адрес строки и возвращающий её длину, если строка расположена в произвольном месте 32-разрядного адресного пространства.
В случае виртуализации - перед вызовом 16-разрядного кода создаётся таблица виртуализации, через которую осуществляется мапинг 16-разрядных обращений в 32-разрядное адресное пространство и где помимо основного 16-разрядного сегмента, содержащего код 16-разрядной функции - можно также задать окна для внешнего чтения и внешней записи. В таком случае, если виртуализованный код осуществляет чтение за пределами диапазона адресов основного сегмента - проверяется попадание чтения в окно внешнего чтения и если попадание есть - обращение транслируется в основное 32-разрядное пространство через базу из таблицы виртуализации и смещение в окне обращения. За счёт такого подхода 16-разрядная функция STRLEN может определить длину строки, находящейся в любом месте 32-разрядного адресного пространства.
В реальной жизни такое вряд ли случится и главной целью виртуализации приложений будет запуск целых 16-разрядных программ из различных операционок PDP-11, но механизм виртуализации при этом останется тем же самым.





Ответить с цитированием