Таблица сегментов хранится в 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]
, зависят только от значений в скрытой части регистров сегментов и не зависят от режима ЦП); поэтому удаление устаревших режимов ЦП бесполезно (устранение поддержки реального режима не приведет к уменьшению размера или сложности ЦП).
Для других процессоров; большинство из них не поддерживают сегментацию (и поддерживают только разбиение по страницам или ничего), и я не знаю, как это работает для тех, кто его поддерживает. Однако я сомневаюсь, что какой-либо процессор будет выполнять поиск таблиц каждый раз, когда что-то выбирается (это будет слишком медленно / дорого, чтобы быть практичным); и я ожидаю, что для всех процессоров, которые поддерживают сегментацию, информация для «используемых в данный момент» сегментов каким-то образом хранится внутри.