Где хранится таблица сегментов? - PullRequest
0 голосов
/ 18 ноября 2018

В схеме сегментации каждый раз, когда осуществляется доступ к памяти, MMU выполняет перевод с фактического адреса, просматривая таблицу сегментов.

Таблица сегментов хранится в TLB или в ОЗУ?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Таблица сегментов хранится в TLB или в ОЗУ?

Это зависит от того, какой тип процессора и в каком режиме находится процессор.

Для 80x86, когда загружен регистр сегмента, ЦПУ сохраняет «базовый адрес, лимит и атрибуты» для сегмента в скрытой части регистра сегмента.

Для реального режима, режима virtual8086 и режима управления системой, когда загружен регистр сегмента, ЦП просто «скрытая база сегмента = значение сегмента * 16» и в ОЗУ нет таблиц.

Для защищенного режима и длинного режима, когда загружается регистр сегмента, CPU использует значение, загружаемое в регистр сегмента, в качестве индекса в таблице в ОЗУ и (после выполнения проверок защиты) загружает «базовый адрес, предел и атрибуты "информация из соответствующей записи таблицы в скрытой части сегмента регистра.

Обратите внимание, что (для защищенного режима) почти никто не использовал сегментацию, потому что загрузка регистров сегмента медленная (из-за проверок защиты и поиска таблиц); поэтому производители ЦП оптимизировали ЦП для «отсутствия сегментации» (например, если базы сегментов равны нулю, вместо того, чтобы делать «линейный адрес = виртуальный адрес + база сегмента», современный ЦП просто сделает «линейный адрес = виртуальный адрес» и избежит затрат на ненужное добавление и запуск поиска кеша / памяти раньше) и не особо беспокоило оптимизацию загрузки регистров сегмента; и затем, когда AMD разработала длинный режим, они поняли, что никто не хочет сегментации, и отключили большую часть ее для 64-битного кода (игнорирование баз сегментов для большинства регистров сегментов, чтобы избавиться от дополнительного сложения, и игнорирование ограничений сегментов, чтобы избавиться от стоимости сегмента лимитные проверки). Однако операционные системы, которые не используют сегментацию, использовали gs и fs в качестве хака для получения быстрого доступа к данным, относящимся к конкретному ЦП или потокам (поскольку, в отличие от некоторых других ЦП, 80x86 не имеет регистров, которые может быть изменено только кодом супервизора, который был бы более удобен для этой цели); поэтому AMD сохранила поведение «линейный адрес = виртуальный адрес + база сегмента» для этих двух регистров сегмента и добавила возможность изменять скрытую часть «базового адреса» gs и fs (через MSR и swapgs). чтобы упростить перенос операционных систем (Windows) в длинный режим.

Другими словами, для 80x86 существует 3 различных способа задания информации сегмента (путем расчета, поиска в таблице или MSR).

Также обратите внимание, что для большинства инструкций (исключая такие вещи, как загрузка регистров сегмента) ЦП 80x86 не заботится о том, как была установлена ​​информация сегмента, а использует только скрытые части регистров сегмента. Это означает, что ЦПУ не нужно обращаться к таблице каждый раз, когда он выбирает код из cs, и каждый раз, когда он выбирает данные из памяти. Это также означает, что большинству ЦП не важно, в каком режиме он находится (например, такие инструкции, как mov eax,[ds:address], зависят только от значений в скрытой части регистров сегментов и не зависят от режима ЦП); поэтому удаление устаревших режимов ЦП бесполезно (устранение поддержки реального режима не приведет к уменьшению размера или сложности ЦП).

Для других процессоров; большинство из них не поддерживают сегментацию (и поддерживают только разбиение по страницам или ничего), и я не знаю, как это работает для тех, кто его поддерживает. Однако я сомневаюсь, что какой-либо процессор будет выполнять поиск таблиц каждый раз, когда что-то выбирается (это будет слишком медленно / дорого, чтобы быть практичным); и я ожидаю, что для всех процессоров, которые поддерживают сегментацию, информация для «используемых в данный момент» сегментов каким-то образом хранится внутри.

0 голосов
/ 18 ноября 2018

Таблица сегментов является справочной, когда вы используете память. Таким образом, таблица должна храниться постоянно для последующего использования, поэтому она хранится в физическом адресе, то есть в ОЗУ.

...