четверг, 8 октября 2009 г.

История GlobalLock, часть 2: селекторы

Это перевод A history of GlobalLock, part 2: Selectors. Автор: Реймонд Чен.

С приходом 80286, Windows могла воспользоваться преимуществами "защищённого режима" ("protected mode") этого процессора. Ещё не существовало виртуальной памяти, но вы могли использовать защиту памяти. Глобальные описатели (handles) превратились в "дескрипторы" ("descriptors"), обычно известные под именем "селекторы" ("selectors").

Архитектурное примечание: процессор 80286 имел поддержку как для "локальной таблицы дескрипторов", так и для "глобальной таблицы дескрипторов", что делало возможным каждому процессу работать в чём-то, напоминающем собственное адресное пространство, но сделать так означало разорвать обратную совместимость с Windows 1.0, где вся память была общей (глобальной).

Адреса в защищённом режиме на 80286 состояли из селектора и смещения, а не просто из сегмента и смещения. Это может казаться тривиальным изменением, но оно действительно важно, потому что позволяет использовать селектор наподобие таблиц описателей (handle table).

Когда вы создавали селектор, вы указывали целую кучу атрибутов, например, был ли это селектор для кода или для данных, был ли он загружен или выгружен (discarded), где размещалась его память (всё ещё никакой виртуальной памяти, поэтому вся память физическая).

GlobalAlloc теперь возвращала селектор. Если вы хотели, вы могли просто использовать его напрямую, как часть адреса (селекторную). Когда вы загружали селектор, CPU проверял, доступен (present) ли селектор, выгружен (discarded) или является недопустимым (invalid).
  • Если он был доступен, то всё было в порядке.
  • Если он был выгружен, то возбуждалось исключение "не доступен" (вау, у нас теперь есть исключения!). Менеджер памяти мог поймать это исключение и сделать всё необходимое по загрузке селектора. Это означало выделение памяти (возможно, с запуском процесса уплотнения и выгрузкой других блоков для освобождения места), и, если это был блок кода, то загрузке данных с диска и пропатчивании указателей.
  • Если он был недопустимым, то возбуждалась Невосстановимая Ошибка Приложения (Unrecoverable Application Error). Это знаменитая "UAE".
Поскольку все попытки доступа к памяти теперь автоматически перенаправлялись через аппаратную таблицу дескрипторов, то это означало, что память может перемещаться относительно незаметно. Все существующие указатели будут оставаться корректными, потому что все изменения при перемещении блоков памяти теперь происходят в таблицах дескрипторов.

Для совместимости с Windows 1.0, GlobalAlloc продолжала эмулировать все правила перемещения памяти, что были раньше. Просто теперь числовые значения селекторов никогда больше не менялись (и, пожалуйста, давайте не будем спорить на тему, хороша или плоха обратная совместимость).

В следующий раз: переход к Win32.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.