Как перекрытие сегментов реального режима x86 способствует экономии памяти?

Я учу своих 12 лет. 8086 на ассемблере, и вчера мы говорили о памяти, адресации и сегментации. Я показал ему, как сегменты можно визуализировать как последовательность перекрывающихся блоков по 64 КБ, начиная с 16-байтовых границ, со смещением в виде указателя в стиле 8080 внутри сегмента. Потом он задал вопрос, на который я не смогла ответить: почему (зачем, с какой целью) они пересекаются?

Пытаясь исследовать этот вопрос, я нашел много копий 20-битной математики и несколько расплывчатых упоминаний о некоторой экономии памяти, которую эта схема предположительно позволяет. Может ли кто-нибудь рассказать о части экономии памяти? Или какие-либо другие способы практического использования перекрытий?


person zvolkov    schedule 04.01.2012    source источник
comment
Работать с сегментированной памятью неинтересно, независимо от того, сколько вам лет ;-) Если бы я был учителем, я бы вместо этого сразу перешел к 32-битной плоской модели памяти. Или 8-битный процессор типа Z80.   -  person Ville Krumlinde    schedule 04.01.2012
comment
@VilleKrumlinde да, мы начали с 8080, у которого не было таких глупых проблем. Всякий раз, когда я учусь или преподаю, мне всегда нравится подчеркивать историческую перспективу, поэтому я не решаюсь пропустить причуды.   -  person zvolkov    schedule 04.01.2012
comment
@VilleKrumlinde: ИМХО дизайн сегмента реального режима 8086 сильно недооценен, в основном потому, что в C не хватает средств, чтобы максимально использовать его. Если бы язык C предоставлял средства объявления указателей, часть смещения которых гарантированно равна нулю, и имел бы методы распределения, возвращающие такие указатели, гениальность сегментации в реальном режиме была бы гораздо более очевидной.   -  person supercat    schedule 16.01.2014


Ответы (3)


Чем меньше перекрытий, тем меньше у вас будет выбора, где начинается сегмент в физической памяти. Это создает промежутки между сегментами, которые бесполезны, что приводит к трате памяти. Выбор дизайна никогда не создает разрыв больше 15 байт. Возможно, это немного переусердствует, но 8086 был разработан в эпоху, когда 1 мегабайт был достаточно для всех. А покупка 64 килобайт сильно ударит по вашему бюджету. Достаточно драгоценный, чтобы не хотеть тратить на пробелы.

person Hans Passant    schedule 04.01.2012

Экономия памяти - это совершенно неправильный взгляд на ИМО. Этот процессор появился в то время, когда 16-битное адресное пространство стало действительно тесным. Другие процессоры с 16-битным адресным пространством применяли методы переключения банков постфактум. 20-битное адресное пространство было значительным одобрением (24 или 32-битное в то время было просто сумасшедшей болтовней). Вместо того, чтобы использовать внешнее переключение банков (которое сложно программировать), они использовали регистры. Что ж, угадайте, процессор внутри 16-битный, поэтому можно использовать 16-битные регистры. Теперь получить 20 бит из пары 16-битных регистров — интересная задача. Использование сегмента в качестве основного выравнивания абзаца дает вам полный диапазон (плюс небольшое превышение, но это совсем другая проблема) наиболее гибким способом (помните боль переключения банков, о которой я упоминал? Это в первую очередь из-за невозможности сделать это). мелкозернистым способом).

person Brian Knoblauch    schedule 04.01.2012
comment
Это 20-битная часть истории. Он отвечает на вопрос, какие ограничения привели к этому дизайнерскому решению. Я задаю другой вопрос: каковы преимущества этого дизайнерского решения помимо удовлетворения ограничений. - person zvolkov; 05.01.2012
comment
Я думал, что покрыл и это. Проще говоря, единственное реальное преимущество заключается в том, что вы можете генерировать неперемещаемые изображения с одним сегментом кода, которые на самом деле БУДЕТ перемещаемыми (без связывания/фиксации), не разрешая манипулирование регистром сегмента для сегмента кода. Также известный как исполняемый файл формата .com в DOS. - person Brian Knoblauch; 05.01.2012
comment
@BrianKnoblauch: В коде с ограниченными ресурсами возможность идентифицировать любой блок памяти, выровненный по абзацу, с двухбайтовым значением может быть более полезным, чем необходимость использовать для этой цели три или четыре байта. В ассемблерном коде, если нужны указатели на множество объектов, возможность использовать два байта на указатель вместо четырех может легко компенсировать потерю памяти за счет округления размера объекта. Жаль, что C не имеет двухбайтового типа указателя, состоящего только из сегментов. - person supercat; 16.01.2014

Предположим, у вас есть служба парковки в длинном узком переулке, поэтому все автомобили припаркованы в стиле параллельной парковки. Некоторые из ваших клиентов водят автомобили и используют только 1 место. Другие ездят на лимузинах и требуют 2 места. Одним из способов парковки транспортных средств было бы выделение 2 мест для каждого транспортного средства, независимо от его размера. В ваших заявках будет указано: «Автомобиль припаркован, начиная с места 0 (максимальный размер транспортного средства — 2 места)», или «Начиная с места 2», или «Начиная с места 4» и т. д.

Это сработает, но места будут потрачены впустую, потому что вы резервируете 2 места для автомобилей, которым требуется только 1. Поэтому вместо этого вы упаковываете автомобили вместе, при этом автомобили занимают только одно место, а лимузины — два. Ваши сотрудники знают, что машина занимает только одно место, поэтому, если в билете написано «Начиная с места 1 (максимальный размер автомобиля — 2 места)», они знают, что «Машина находится на месте 1, а место 2 принадлежит кому-то другому». Автомобильное место 2 на самом деле перекрывает лимузин, припаркованный в местах 2 и 3, но было бы плохой идеей использовать его, иначе вы можете повредить лимузин.

person Raymond Chen    schedule 04.01.2012
comment
Спасибо за аналогию! Думаю, я мог бы нанять автобусы, грузовики и другие транспортные средства разного размера. - person zvolkov; 04.01.2012