Подтвердить что ты не робот

Где находится буфер текстового видео, если он не равен 0xB8000?

Около 15 лет назад я развлекался и раздражал своего учителя CS, написав плохой код, который будет напрямую изменять текст на мониторе. Это было легко осуществлено путем доступа к видеопамяти на 0xB8000 на совместимых с VGA совместимых ПК.

Ускоренный переход к сегодняшнему дню, я решил попробовать свой старый трюк через порт отладки, который дает мне доступ к чтению физической памяти. К моему удовлетворению, он по-прежнему работал на первой платформе, на которой я ее пробовал. Затем, уныло, я обнаружил, что он не работает во многих других системах. Кажется, что системы, на которых он не работает, имеют графику UMA (разделяемая память).

Итак, вопрос для всех вас, писателей BIOS, парней ОС низкого уровня и гуру видеодрайверов - если я в обычном цветовом текстовом формате 80x25 на ПК-совместимой системе с общей графической памятью в реальном режиме и содержимое 0xb8000 - 0xB8FFF все 0xFF вместо того, чтобы давать мне то, что на экране, куда шел экранный буфер?

4b9b3361

Ответ 1

Ах, если это экран BIOS, тогда все ставки отключены. Тот факт, что это BIOS на материнской плате с интегрированной графикой, еще более усугубляет видео странность.

Вполне вероятно, что "классическая" функциональность VGA предназначена для всех намерений. С внешней видеокартой это будет невидимо для BIOS - он все еще видит видеокарту VGA. Но BIOS, подключенный к видеокарте, не нуждается в настройке поддельного слоя VGA и старой памяти 20-битного адресного пространства памяти, чтобы вставить какой-либо текст на экран.

Вместо этого BIOS может напрямую взаимодействовать с картой (через какой-то проприетарный режим), пока операционная система не будет запущена, и в этот момент она сама выполняет картографирование памяти. Это имеет большое преимущество в том, что для карты, которая разделяет основную память, вы не получаете пустой экран при запуске, если ваша оперативная память установлена ​​неправильно (вместо этого режим приватной BIOS видеокарты может использовать буфер, обычно зарезервированный для какой-либо другой цели, позволяя вам войти в BIOS и установить 0 МБ ОЗУ)

Ответ 2

CGA (адаптер цветной графики) и MDA (Monochrome Display Adapter) используются разные регионы. Один (цвет) - 0xB8000; но монохромный начинается с 0xB0000. Помните, что вы могли одновременно отображать оба дисплея на машине.

См. Карта памяти DOS (хотя у нее есть опечатка в смещении для CGA - должно быть 8000h не 0800h).

Что касается VGA (Video Graphics Array), его память начинается ниже, на границе 640K в 0xA0000 и продолжается для 64K - но он может выйти за рамки, так как карта может иметь до 256K. Некоторые пример кода для программирования VGA здесь. Но это не так просто, как несколько режимов видео. Вы можете попробовать здесь для некоторой помощи.

У вас есть VGA, а не EGA или XGA или Super-VGA? Все они имеют немного другую семантику... Но все же, я уверен, что любой из них должен поместить текст либо в 0xB0000, либо 0xB8000. Что произойдет, если вы наберете

MODE MONO

или

MODE CO80

- это влияет на отображение? Они переключались бы с одного текстового режима адаптера на другой, под DOS.

Ответ 3

Возможно, в этой точке виртуальная память включена.

Например, например, Я пытался записать в буфер видео в iPXE codebase, и он не отражался на экране. После исследования я понял, что мне нужно вызвать функцию:

phys_to_virt(0xB8000);

чтобы иметь возможность напрямую записывать в видео буфер.