Рассмотрим логический адрес 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](https://i.stack.imgur.com/0iN7Q.jpg)
Он оборачивается.
Математически мы просто отбрасываем седьмую цифру, чтобы 1 000 000,0превращается в 000 000.0.
То же самое с 21-м битом - он отбрасывается и 0x10ffef
превращается в 0x0ffef
.
Еще один хороший способ думать об этом - это делать арифметику на ручных часах: 7 + 7 = 14 = 2.
После конца снова наступает начало.
Другой способ визуализировать этопредставьте, что конец памяти приклеен к началу:
![Memory wrapped as a cylinder](https://i.stack.imgur.com/GSxQ8.png)
Теперь некоторые программы использовали эту упаковку.
Не уверенесли это была форма запутывания, если это использовалось биосом, у которого уже был установлен сегмент, указывающий на конец памяти.
Какова бы ни была причина, когда 80286 расширил шину памяти до 24 бит, это обертывание было устранено.
Как будто мы добавили еще четыре цифры в наш одометр, 1 000 000,0 теперь можно представить без проблем.
Чтобы эмулировать старый 20-битный адрес шины, был добавлен внешний логический элемент И, чтобы бит 20 был равен нулю.
Это похоже на почерк 0 над 7-й цифрой одометра.
Проблема решена.
Это был взлом, только бит 20 установлен на ноль, старшие биты не тронуты.
Этот вид манипуляций всегда генерировал повторяющиеся паттерны, это помогает тратить немноговремени, чтобы нарисовать их - особенно, чтобы увидеть, насколько неприятными они могут стать, если забыть о включении a20.