Как линия A-20 преодолевает проблему упаковки - PullRequest
0 голосов
/ 07 октября 2018

Когда IBM проектировала машины IBM PC AT, она использовала их более новый микропроцессор Intel 80286, который не был полностью совместим с предыдущими микропроцессорами x86 в реальном режиме.Эта проблема?Более старые процессоры x86 не имели адресных линий от A20 до A31.У них еще не было адресной шины такого размера.Любые программы, которые выходят за пределы первого 1 МБ, могут быть обернуты.В то время как это работало тогда, адресное пространство 80286 требовало 32 адресных строки.Однако, если все 32 строки доступны, мы снова сталкиваемся с проблемой переноса.

Выше приведен отрывок из следующей ссылки по разработке ОС:

http://www.brokenthorn.com/Resources/OSDev9.html

У меня есть сомнения, что я не совсем понимаю, в чем именно заключается проблема с переносом, но я думаю, это означает, что попытка получить доступ к адресу, превышающему 1 МБ, приведет к обратному адресу в пределах 1 МБ, поскольку чем вышебиты адреса ничего не значат из-за наличия только 20 адресных строк от A0-A19.

Правильно ли мое предположение?

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

Так как линия A-20 решает эту проблему?

1 Ответ

0 голосов
/ 07 октября 2018

Рассмотрим логический адрес 0xffff:0xffff, его линейный адрес равен 0x10FFEF.
Если взглянуть на 0x10FFEF в двоичном виде, вы увидите следующее:

B B    B    B    B    B  B 
i i    i    i    i    i  i
t t    t    t    t    t  t

2 1    1    1    0    0  0 
0 9    5    1    7    3  0
--------------------------
1 0000 1111 1111 1110 1111

Как видитетребуется 21 бит (от 0 до 20) для представления этого адреса.0xffff:0xffff является действительным логическим адресом, поэтому 0x10ffef является действительным линейным адресом.

Это показывает, что 16-разрядные программы могут генерировать 21-разрядные адреса.
Но ширина шины 8086 и 80186 составляла 20 бит.
Что происходит сейчас?

Что происходит, когдаВы проезжаете столько миль, что ваш одометр показывает 999 999,9?

Rolling odometer

Он оборачивается.
Математически мы просто отбрасываем седьмую цифру, чтобы 1 000 000,0превращается в 000 000.0.
То же самое с 21-м битом - он отбрасывается и 0x10ffef превращается в 0x0ffef.

Еще один хороший способ думать об этом - это делать арифметику на ручных часах: 7 + 7 = 14 = 2.
После конца снова наступает начало.
Другой способ визуализировать этопредставьте, что конец памяти приклеен к началу:

Memory wrapped as a cylinder


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

Какова бы ни была причина, когда 80286 расширил шину памяти до 24 бит, это обертывание было устранено.
Как будто мы добавили еще четыре цифры в наш одометр, 1 000 000,0 теперь можно представить без проблем.

Чтобы эмулировать старый 20-битный адрес шины, был добавлен внешний логический элемент И, чтобы бит 20 был равен нулю.
Это похоже на почерк 0 над 7-й цифрой одометра.

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

...