Каково современное использование глобальной таблицы дескрипторов (GTD)?

После долгого чтения я действительно запутался. Из того, что я прочитал:

  1. Современные ОС вообще не используют сегменты.

  2. GDT используется для определения сегмента в памяти (включая ограничения).

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

  4. Википедия говорит, что GDT все еще присутствует в 64-битном режиме; GDT должен быть определен, но обычно никогда не изменяется и не используется для сегментации.

Зачем он нам вообще нужен? И как линукс его использует?


person Moshe Levy    schedule 08.11.2020    source источник


Ответы (1)


  1. Современные ОС вообще не используют сегменты.

Современная ОС (для 64-битных 80x86) по-прежнему использует сегментные регистры; просто их использование в основном скрыто от пользовательского пространства (и большая часть кода пользовательского пространства может их игнорировать). Конкретно; ЦП определит, является ли код 64-битным (или 32-битным, или 16-битным) из того, что ОС загружает (из GDT или LDT) в CS, прерывания по-прежнему сохраняют CS и SS для прерванного кода (и загружают их снова at iret), GS и/или FS обычно используются для локального хранения потока и/или локального хранилища ЦП и т. д.

  1. GDT используется для определения сегмента в памяти (включая ограничения).

Сегменты кода и данных — это лишь одна из вещей, для которых используется GDT. Другое основное использование — определение, где находится сегмент состояния задачи (который используется для поиска карты разрешений порта ввода-вывода, значений для загрузки в CS, SS и RSP при изменении уровня привилегий, вызванном прерыванием, и т. д.). Также для 64-битного кода (и 32-битного кода/процессов, работающих под 64-битным ядром) по-прежнему возможно использовать шлюзы вызовов, определенные в GDT, но большинство операционных систем не используют эту функцию для 64-битного кода ( вместо этого они используют syscall).

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

Да. Бит супервизора таблицы страниц определяет, может ли код, работающий с CPL=3, получить доступ к странице или нет (или должен ли код иметь CPL=2, CPL=1 или CPL=0 для доступа к странице).

  1. Википедия говорит, что GDT все еще присутствует в 64-битном режиме; GDT должен быть определен, но обычно никогда не изменяется и не используется для сегментации.

Да, Википедия права. Обычно ОС настраивает GDT на ранней стадии загрузки (для TSS, CS, SS и т. д.), а затем не имеет причин изменять его после загрузки; и сегментные регистры не используются для защиты сегментированной памяти (но используются для других целей - определения размера кода, должен ли обработчик прерывания вернуться к CPL=0 или нет и т.д.).

person Brendan    schedule 08.11.2020
comment
Спасибо! 1.Можете ли вы привести пример, когда мы проверяем GDT? 2. DPL сохраняется в GDT, так что когда мы его проверяем? (если у нас есть защита памяти от подкачки, зачем она нам?) - person Moshe Levy; 09.11.2020
comment
3. Когда мы проверяем размер кода? и зачем нам это нужно? 4. Каждая ли ссылка на память проходит через GDT? например CS::1000, переходит к GDT и проверяет соответствующие биты? а как насчет 1000(ссылка на память)? - person Moshe Levy; 09.11.2020
comment
@MosheLevy: когда большинство вещей (явная загрузка, прерывание, дальняя передача управления, но не syscall) вызывают загрузку значения в сегментный регистр; ЦП извлекает информацию из GDT (или LDT) и проверяет эту информацию. Если проблем нет (нет общей ошибки защиты), информация кэшируется в ЦП (в скрытой части сегментного регистра) для последующего использования (например, чтобы ЦП не приходилось каждый раз постоянно проверять запись GDT для сегмента кода). он декодирует инструкцию). - person Brendan; 09.11.2020
comment
@MosheLevy: DPL используется только как часть ЦП, проверяющего информацию из GDT/LDT, когда значение загружается в проверку сегментного регистра; чтобы определить, имеет ли выполняющийся в данный момент код привилегию, необходимую для использования записи GDT/LDT. - person Brendan; 09.11.2020