- Современные ОС вообще не используют сегменты.
Современная ОС (для 64-битных 80x86) по-прежнему использует сегментные регистры; просто их использование в основном скрыто от пользовательского пространства (и большая часть кода пользовательского пространства может их игнорировать). Конкретно; ЦП определит, является ли код 64-битным (или 32-битным, или 16-битным) из того, что ОС загружает (из GDT или LDT) в CS
, прерывания по-прежнему сохраняют CS
и SS
для прерванного кода (и загружают их снова at iret
), GS
и/или FS
обычно используются для локального хранения потока и/или локального хранилища ЦП и т. д.
- GDT используется для определения сегмента в памяти (включая ограничения).
Сегменты кода и данных — это лишь одна из вещей, для которых используется GDT. Другое основное использование — определение, где находится сегмент состояния задачи (который используется для поиска карты разрешений порта ввода-вывода, значений для загрузки в CS, SS и RSP при изменении уровня привилегий, вызванном прерыванием, и т. д.). Также для 64-битного кода (и 32-битного кода/процессов, работающих под 64-битным ядром) по-прежнему возможно использовать шлюзы вызовов, определенные в GDT, но большинство операционных систем не используют эту функцию для 64-битного кода ( вместо этого они используют syscall
).
- В таблице страниц есть бит супервизора, который указывает, предназначено ли текущее местоположение для ядра.
Да. Бит супервизора таблицы страниц определяет, может ли код, работающий с CPL=3, получить доступ к странице или нет (или должен ли код иметь CPL=2, CPL=1 или CPL=0 для доступа к странице).
- Википедия говорит, что GDT все еще присутствует в 64-битном режиме; GDT должен быть определен, но обычно никогда не изменяется и не используется для сегментации.
Да, Википедия права. Обычно ОС настраивает GDT на ранней стадии загрузки (для TSS, CS, SS и т. д.), а затем не имеет причин изменять его после загрузки; и сегментные регистры не используются для защиты сегментированной памяти (но используются для других целей - определения размера кода, должен ли обработчик прерывания вернуться к CPL=0 или нет и т.д.).
person
Brendan
schedule
08.11.2020