Если мы говорим об этом в среде x86, это не должно быть невозможным.Это должно использоваться с осторожностью, хотя, потому что инструкции x86 имеют переменную длину.Длинная инструкция может перезаписать следующую (ые) инструкцию (и), а более короткая инструкция оставит остаточные данные из перезаписанной инструкции, которую следует выполнить (инструкция NOP).
Когда защита x86 впервые стала защищенной, справочные руководства Intel рекомендовалиследующий метод для отладки доступа к областям XO (только для выполнения):
- создать новый пустой селектор («высокая» часть дальних указателей)
- установить его атрибуты для атрибутаXO area
- свойства доступа нового селектора должны быть установлены RO DATA, если вы только хотите посмотреть, что в нем
- , если вы хотите изменить данные, свойства доступа должны быть установлены в RW DATA
Итак, ответ на проблему находится на последнем шаге.RW необходим, если вы хотите иметь возможность вставить инструкцию точки останова, что и делают отладчики.Более современные процессоры, чем 80286, имеют внутренние регистры отладки для обеспечения возможности неинтрузивного мониторинга, который может привести к созданию точки останова.
Windows сделала доступными строительные блоки для этого, начиная с Win16.Они, вероятно, все еще на месте.Я думаю, что Microsoft называет этот класс манипулирования указателями «громоздким».
Однажды я написал очень быстрый 16-битный движок базы данных в PL / M-86 для DOS.Когда появилась Windows 3.1 (запущенная на 80386), я перенес ее в среду Win16.Я хотел использовать доступную 32-битную память, но PL / M-32 не было доступно (или Win32 в этом отношении).
, чтобы решить проблему, моя программа использовала thunking следующим образом
- определил 32-битные дальние указатели (sel_16: offs_32) с использованием структур
- выделил 32-битные области данных (<=>> размер 64 КБ) с использованием глобальной памяти и получил их в 16-битныхдальний указатель (sel_16: offs_16) в формате
- заполняет данные в структурах путем копирования селектора, а затем вычисления смещения с использованием 16-разрядного умножения с 32-разрядными результатами.
- загружает указатель/ структура в es: ebx с использованием префикса переопределения размера команды
- осуществляла доступ к данным, используя комбинацию префиксов размера инструкции и размера операнда
Как только механизм был исправлен, он работал беззаминкаСамые большие области памяти, которые использовала моя программа, имели двойную точность 2304 * 2304, что составляет около 40 МБ.Даже сегодня я бы назвал это «большим» блоком памяти.В 1995 году он составлял 30% от обычной карты памяти SDRAM (128 МБ PC100).