Пишу индекс регистра 3B9h в порт 22, читаю данные в 23. Все при запрещенных прерываниях. Получаю результат 100b. Я вообще хотел его таким сделать и думал что там установлены единицы Если я хочу оставить B8-BF то мне нужно оставить smi так как я их прочитал насколько я понимаю. Осталось найти где это пернаправление на A0000-BFFFF
NoName Откуда 3B9h? Написано что B9h Моя вина не пояснил что к чему. Есть обработчик SMI, и есть то что вызывает прерывания SMI. Обработчик прячиться по адрессу A0000-BFFFF. А в VGACTL мы отключаем один из десятков источников прерываний SMI. Если процессор обратиться к участку A0000-BFFFF то есть три варианта что произойдет. Первый сроботает обработчик SMI. Второе просто перенаправиться в видео память третийй вариант мы попадем ОЗУ-память тут должен прятаться обработчик SMI. Все источники не отключишь нужно будет SMI обработчик двигать. Путем установки базы SMAR.
Pavia Прошу прощения насчет 3B9. Описался, пробовал на самом деле без тройки. Путаницу внесла страница 149 где регистры написаны с тройками. Правильную ли маску показывает мне железо? возвращает 4d => 100b. Это значит что 0xA0000 - 0xB7FFF и так не вызывают исключение #SMI. Я так понимаю что её мне менять ненужно. Пойду смотреть как двигать #SMI обработчик. Кстати по этой документации SMM System Code лежит в диапазоне 0xA0000h - 0xC0000h
Страница 51: "Index CDh, CEh, CFh SMAR: SMM Address Region/Size Register (R/W)" Допустим я запускаю дос и меняю базу smar за пределы первого мегабайта. Этого достаточно? Или нужно еще что то сделать? Напомню что хочу оставить видеобуфер 0xB8000 - 0xBFFFF живым для начала. Похоже что нужно редактировать не только SMAR но и SMHR.
NoName Достаточно. Только там это хитрым образом делается. Базу можно поменять только в SMM режиме, если не ошибаюсь. Поэтому надо вызвать обработчик SMM прогамно (там есть команда или регистр) и там сменить базу. Вроде так. В исходниках Award биоса есть участок установки SMM. Можно его поизучать. 4h=> 100b. Это значит что 0xA0000 - 0xB7FFF и так не вызывают исключение. Если бы вызывали, тогда надо было бы отключить чтобы доступ получить к памяти. Иначе бы SMI могбы подсовывать что-нибудь. 0xB8000 - 0xBFFFF он какраз через SMI и работает. При доступе к этой памяти вызываетя обработчик SMI. Он выбирает символ из шрифта и атрибут-цвета заносит в видео память скорее всего в LFB. Если можно перехватить/переписать SMI обработик, то тут можно любые выкрутасы вытворять. К примеру сделать Hi end графику. Другой варинт. Это задействовать защищенный режим и включить страничную адрессацию. И перейти в режим V86.
Заполняю через ввод вывод ccr1, smar с учетом выравнивания на произвольный мегабайт (возьму третий или второй). Насколько я понял (стр. 80) smhr записывать ненужно потому что он автоматически пересчитывается относительно smar. вызываю инструкции (стр. 82) SMINT (0F 38h) и RSM (0F AAh), (Resume Normal Mode) Все ли правильно? Если записать в память по этим адресам dword и считать его то они несовпадают. Насколько я понял поможет изменение smar описанное выше. В новой версии ОС я сделаю поддержку vesa, наверное это лучше чем железное разнообразие с использованием LFB. Спасибо за второй вариант, лучший будет первый.
Можно ли вообще обработчик вынести из области первого метра? Я всегда почему-то считал что SMM работает в полной плоской модели памяти.
а что с адрессацией? Маны по процу, кажется этого не запрещали или я не в курсе или забыл может быть..., но адрессация наподобие анреала там ведь так? И вообще она меняется? Скажем вниз меняется? Если нет, то ищи у себя, стало быть причину.
Насколько я понял по моим исследованиям (возможно, напишу неточно но могу посмотреть результы) основная проблема со SMI - это то, что некоторые чипсеты просто закрывают доступ к SMI - нельзя ни читать, ничего. Если доступ к SMI получен, то проблем с переносом (а перенос идет вроде бы вообще по дефолту с A0000 немного выше после STARTUP) или увеличением памяти SMI-обработчега быть не должно. На одном из чипсетов так и было - пришлось сначала дизасмить BIOS, в нем я обнаружил callback-процедуры, на которые в самом BIOS ссылок не было как не было ссылок в оригинальной (==BIOS'овской) таблице прерываний. После того, как я открыл BIOS на запись и перезаписал эти процедуры на свои и принудительно вызвал SMI, я смог сдампить сам обработчег. Анализ обработчега показал, что он определенно обладает неким "Экспортом" функций, которые [возможно] вызываются так называемыми "драйверами чипсета" - то, что инсталлируеццо с диска приложенного к компу его vendor'ом - через определенные обращения к портам с определенными значениеми регистров. Однако в анализе я не нашел функций типа "установить внешний обработчег" (callback) или "перенести память" или другие "низкоуровневые" функи. Создалось впечатление что через этот интерфейс можно лишь настраивать параметры чипсету, но не более.