Почему сегменты начинаются с границ абзаца? - PullRequest
4 голосов
/ 27 февраля 2010

В модели сегментированной памяти реального режима сегмент всегда начинается на границе абзаца. Размер абзаца составляет 16 байт, поэтому адрес сегмента всегда делится на 16. В чем причина / преимущество наличия сегментов на границах абзаца?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2010

Это не столько преимущество, сколько аксиома - модель сегментации реального режима 8086 разработана на аппаратном уровне, так что регистр сегмента определяет границу абзаца.

Сегментный регистр определяет базовый адрес старших 16 битов 20-разрядного адресного пространства 8086, младшие 4 бита этого базового адреса по существу были обнулены.

Сегментированная архитектура была одним из способов, позволяющих архитектуре 16-разрядных регистров 8086 иметь возможность адресовать полный мегабайт (!) Адресного пространства (для которого требуется 20-битная адресация).

Для еще большей истории следующий шаг, который Intel предприняла в архитектуре x86, заключался в том, чтобы абстрагировать регистры сегментов от непосредственного определения базового адреса. Это был защищенный режим 286, где регистр сегмента содержал «селектор», который вместо определения битов для физического базового адреса представлял собой индекс для набора таблиц дескрипторов, которые содержали информацию о физическом адресе, разрешения для доступа к физическому адресу. память и другие вещи.

Сегментные регистры в современных 32-разрядных или более мощных процессорах x86 по-прежнему делают это. Но с учетом того, что смещения адресов могут указывать полные 32-битные адресации (или 64-битные на процессорах x64) и таблицы страниц, способные обеспечить семантику виртуальной памяти в сегменте, определенном селектором, модель программирования по существу устраняет необходимость манипулировать сегментными регистрами на уровне приложения. По большей части, ОС устанавливает регистры сегментов один раз, и больше ничего не нужно с ними иметь дело. Поэтому программистам вообще не нужно больше знать, что они существуют.

3 голосов
/ 27 февраля 2010

У 8086 было 20 адресных строк. Сегмент был сопоставлен с верхними 16, оставляя смещение нижних 4 строк или 16 адресов.

1 голос
/ 20 мая 2015

Регистр сегмента хранит адрес ячейки памяти , где начинается этот сегмент . Но регистры сегмента хранят 16-битную информацию. Эти 16 бит преобразуются в 20 бит путем добавления 4 битов 0 к правому концу адреса. Если регистр сегмента содержит 1000H, то он сдвигается влево, чтобы получить 10000H. Сейчас это 20 бит.

При преобразовании мы добавили 4 бита по 0 в конец адреса. Поэтому каждый сегмент в памяти должен начинаться с ячейки памяти , где последние 4 бита равны 0.

Например:

Если сегмент начинается в ячейке памяти 10001H, мы не можем получить к ней доступ, поскольку последние 4 бита не равны 0. Любой адрес в сегментном регистре будет добавлен с 4 битами в правом конце для преобразования в 20 бит. Таким образом, нет никакого доступа к такому адресу.

...