Проблемы при включении линии A20 в 32-битном защищенном режиме - PullRequest
2 голосов
/ 09 января 2020

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

EnableA20:
        .try0:
                call .checkenabled
                cmp eax,0
                jne .done
        .fail:
                jmp $

        .checkenabled:
                push ebx
                mov eax,0x1234
                mov [0x10],eax
                mov ebx,[0x100010]
                sub eax,ebx
                pop ebx
                ret

.done:

Это показывает, что моя адресная строка включена по умолчанию ... Это возможно ??

Где я ошибся? Метод, который я использовал, - записать 0x1234 по адресу 0x10 и прочитать значение с адреса 0x100010. Если значение, которое я написал, совпадает со значением, присутствующим в адресе (из-за переноса), я знаю, что строка не должна быть включена.

Я использую qemu в качестве эмулятора:

qemu-system-i386 myos.bin

РЕДАКТИРОВАТЬ: Похоже, A20 по умолчанию. Однако, если я попытаюсь сделать это:

       .try1:  ;Using keyboard controller to enable A20
                mov al,0xdd
                out 0x64,al
                call .checkenabled
                cmp eax,0
                jne .done

Это провалится! Я читал, что перемещение 0xdd в порт 0x64 включает A20 и не отключает его. В чем здесь проблема?

1 Ответ

4 голосов
/ 09 января 2020

Согласно вики osdev, способ включения линии A20 в защищенном режиме сильно варьируется от одного чипсета к другому. И в некоторых это может даже быть включено bios / bootrom при загрузке. Поэтому обычной практикой является сначала написать процедуру, которая может проверить, включена ли линия A20 (путем записи данных в доступную область оперативной памяти и поиска этих данных для зеркального отображения в адресах с более высокой оперативной памятью), что вы сделали, и ваш подход кажется правильным насколько я могу судить. Только если bios / bootrom не активировал его, попробуйте другие методы.

Когда ваш P C загружается, шлюз A20 всегда отключен, но некоторые BIOS-ы действительно включают его для вас, так как сделать несколько менеджеров с высокой памятью (HIMEM.SYS) или загрузчиков (GRUB). Получив эту проверку, вы можете попробовать все методы, включающие ее один за другим, и посмотреть, какой из них работает для системы

Рекомендуемая процедура для enablig:

Поскольку существует несколько различных методов, которые могут поддерживаться или не поддерживаться, а также потому, что некоторые из них вызывают проблемы на некоторых компьютерах; Рекомендованный метод состоит в том, чтобы попробовать все из них, пока один из них не работает в «порядке наименьшего риска». По существу:

Test if A20 is already enabled - if it is you don't need to do anything at all
Try the BIOS function. Ignore the returned status.
Test if A20 is enabled (to see if the BIOS function actually worked or not)
Try the keyboard controller method.
Test if A20 is enabled in a loop with a time-out (as the keyboard controller method may work slowly)
Try the Fast A20 method last
Test if A20 is enabled in a loop with a time-out (as the fast A20 method may work slowly)
If none of the above worked, give up

для получения дополнительной информации см. Стр. A20 на странице osdev вики: https://wiki.osdev.org/A20

...