Сегментная организация памяти

Печатные платы, программируемая логика, разработка и изготовление аппаратуры

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Сегментная организация памяти

Post by Lavr »

В связи с окончанием минимального варианта модели EDUC-8 с 256 байт памяти,
возник у меня вопрос принципиальный и вот какой.

Я уже заложил в модель возможность расширения памяти до 4...32 КБайт, но вот
где-то на просторах Интернета уже довольно давно читал я дискуссию о том,
что сегментная организация памяти "а ля" i8086, где сегменты могут перекрываться,
имеет преимущество перед механизмом переключения страниц, где каждая из них независима.

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

Так в чем же преимущество сегментной организации памяти "а ля" i8086?
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Мои мысли:
В случае сегментной организации:
а) экономится расширенная память, за счет того, что сегменты могут перекрываться и сам сегмент может быть меньше адресного пространства процессора (256 байт).
б) реализация проще/дешевле - регистр и сумматор.
Можно организовть разные сегменты для команд и данных. Если типов сегментов много (i8086:CS,SS,DS,ES) сложность/стоимость резко возрастает.

Для страничной организации для каждой страници нужен свой регистр
или RAM для всех страниц и ест-но страницы фиксированного размера.
Конечно при необходимости какие-то страницы можно склеить.

Из страничной организации довольно просто организовать виртуальную память (VAX,i386).
Для сегментной это будет намного сложнее (i286, OS/2 ранние версии).

... примерно так ...
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:б) реализация проще/дешевле - регистр и сумматор.
Можно организовть разные сегменты для команд и данных.
Прости, но просто страничная адресация без перекрытия сегментов и того дешевле!
Сумматор - не нужен, а нужен только просто регистр страниц.

И сегменты для команд и данных также можно организовать безо всякого сумматора!
Они только не будут перекрываться.

Меня, собственно, потому и озадачил этот вопрос - в чем преимущество перекрытия
сегментов перед вариантом, где сегменты не перекрываются?

И мне пока это как-то неочевидно совсем...
iLavr
petrenko
Doomed
Posts: 598
Joined: 10 Mar 2012 16:21
Location: РФ

Post by petrenko »

Переменную длину как "+" засчитаете ? :roll:
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Lavr wrote:Меня, собственно, потому и озадачил этот вопрос - в чем преимущество перекрытия
сегментов перед вариантом, где сегменты не перекрываются?
Более оптимальное использование памяти, особенно для кода.
Условно говоря, есть две подпрограммы скомпилированные под офсет 0x0. Одна на 1Кб, вторая на 17Кб.
При организации страницами как на спектруме по 16Кб, первая займёт все 16Кб, вторая вообще не влезет и должна быть разбита на пару частей, что в итоге приведёт к использованию 48Кб или 3х страниц. В варианте для x86 будет использовано 18Кб + "хвосты" на выравнивание по сегменту. Вот такая вот арифметика с сумматором.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

petrenko wrote:Переменную длину как "+" засчитаете ? :roll:
Я, в принципе, советуюсь по конкретному вопросу и не занимаюсь зачетами "+" и "-" ...

Возможно, я не очень четко донёс свои сомнения - но они вот в чем:

Не привлекая высшие материи, как виртуальная память, перезагрузка и перемещение сегментов,
меня сейчас конкретно интересует вот что.

Скажем, в системе на 580ВМ80 на порту 0FFH у меня стоит переключатель памяти
страницами по 64К.
Если на странице 0 в ячейках 0FFFEH, 0FFFFH я исполняю код

Code: Select all

0FFFE: MVI A,01H
0FFFF: OUT 0FFH

то я начну работу в странице 1 с адреса 0000Н.

Аналогично, в системе на 8086 в ячейке 0FFFFH текущего сегмента, я заношу в CS значение,
чтобы попасть в сегмент, отстоящий от текущего на 64К.
Я также начну работу с адреса 0000Н следующего сегмента.

С этой точки зрения механизм с пересечением сегментов не дает мне, как мне кажется, никакого
преимущества
.
В обоих случаях, чтобы пересечь границу сегмента (страницы) мне надо "щелкнуть" регистром
страниц либо регистром сегмента кода.

Так вот с этой точки зрения очевидного преимущества перекрытия сегментов перед вариантом,
где сегменты не перекрываются я не вижу.
Вот я и спрашиваю - может я что-то понимаю не так? Может что-то упускаю из виду?
iLavr
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Именно в этом преимуществ нет.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

jdigreze wrote:Именно в этом преимуществ нет.
Да и мне пока кажется, что нет... просто в памяти как-то осталось, что какая-то есть там
"изюминка", я ещё когда читал про это - отметил сам себе, что не обращал на это внимание...
Но сейчас - прямо из головы выскочило.

Но практически мне сейчас этот вопрос интересен вот с какой точки зрения:
B 8086, чтобы пересечь границу сегмента в 64К нужен либо дальний межсегментный JMP,
либо "щелкнуть" CS, как я объяснил выше.

В PIC - чтобы пересечь границу сегмента делают запись в биты сегмента, которые потом
учитываются во время JMP и CALL.

В многостраничной системе на 580ВМ80, чтобы перейти на другую страницу, надо обратиться
к регистру страниц.

В PDP-8 (EDUC-8 ) чтобы перейти на другую страницу, надо обратиться к диспетчеру
страниц и переход будет во время JMP и CALL.

Я вот, размышляя над схемой EDUC-8, вижу аппаратную возможность сделать переход через
границу сегмента чисто автоматически. Скажем вот так:

Code: Select all

FC 604; C4 - RES 0
FD 601; C1 - SKF
FE 602; C2 - INP 0; просто выполняется
FF 621; D1 - SDF; какая-то программа
;---------------------- граница сегмента
100 622; D2 - OUT 0;--- пересекается автоматически
101 624; D4 - SEND;--- FF-->1_00; 1 -автоматически переносится в сегментный регистр
102 500; A0 - JMP 00
И я призадумался - удобен ли такой механизм пересечения границы сегмента?
И почему он мне такой нигде не встречался ранее?
iLavr
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Возможно, если размер сегмента равен размеру адресного пространства процессора. Т.е. в случае EDUC-8, думается, вполне рабочий вариант.

А вообще, как программисту, мне, наверно, наиболее удобен вариант:
Lavr wrote:В PIC - чтобы пересечь границу сегмента делают запись в биты сегмента, которые потом
учитываются во время JMP и CALL.
плюс учёт перехода на другой сегмент по переполнению счётчика команд.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

jdigreze wrote:А вообще, как программисту, мне, наверно, наиболее удобен вариант:
Lavr wrote:В PIC - чтобы пересечь границу сегмента делают запись в биты сегмента, которые потом
учитываются во время JMP и CALL.
плюс учёт перехода на другой сегмент по переполнению счётчика команд.
А оно именно так и будет! Просто механизм для JMP и CALL там и без меня придумали.
Но размер сегмента небольшой - 256 байт, вот я и подумал, если программа исполняется
линейно, почему бы не пересекать границу сегмента автоматически вперед?

И тут вот и призадумался о наложении сегментов - но в моём случае, как я вижу, оно мне
дополнительных преимуществ не даст.
iLavr