Как сегменты реального режима x86 помогают сэкономить память? - PullRequest
5 голосов
/ 04 января 2012

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

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

Ответы [ 3 ]

4 голосов
/ 04 января 2012

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

3 голосов
/ 04 января 2012

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

2 голосов
/ 04 января 2012

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

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

...