| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Windows/Dos > аппаратные прерывания в dos |
| Автор: xach 10.1.2008, 19:15 |
| всем превед! я написал резидентную программу, которая выводит на экран список номеров аппаратных прерываний у которых есть обработчики. Делал я это следующим образом: 1 - считывал по номеру вектора прерывания 4-х байтный адрес обработчика в формате сегмент-смещение 2 - считывал первый байт обработчика и сравнивал его с опкодом iret. Если первый оператор обработчика - iret, значит это заглушка и обработчика не существует, в противном случае существует а теперь вопрос: как узнать какие обработчики аппаратных прерываний есть в системе средствами dos, bios или иными (может просто где-то в памяти лежит)? В общем проверить работоспособность программы мерси за внимание! |
| Автор: Akina 10.1.2008, 22:16 |
Этот алгоритм неправильный. Заглушка АППАРАТНОГО прерывания в принципе не может быть голым IRET. а зачем - резидентную? Вручную. |
| Автор: SABROG 10.1.2008, 22:32 |
| Может быть я путаю, попробуй функцию 35h (ah=35h, al=номер прерывания, 0-ffh). Результатом в bx будем вектор прерывания. На всякий случай вот тебе TechHelp - http://alexfru.narod.ru/miscdocs/techhelp/techhelp.zip |
| Автор: xach 10.1.2008, 22:34 |
| SABROG, не...мне не нужно получать сам вектор...с этим проблем нет...про эту функцию я знаю. проблема в методе определения того, что в системе присутствует обработчик аппаратного прерывания (08-0fh and 70-77h) ...вотъ...я думал, что с iret - правильный подход...похоже - нет =( |
| Автор: xach 10.1.2008, 22:55 |
| вотъ...откопал в талмуде о прерываниях INT 21 - DOS 2+ - IOCTL - GET DEVICE INFORMATION AX = 4400h BX = handle Return: CF clear if successful DX = device information word (see #01423) AX destroyed CF set on error AX = error code (01h,05h,06h) (see #01680 at AH=59h/BX=0000h) с помощью этой функции (судя по названию =) ) можно получить инфу об устройствах. но что вписывать в поле handle (bx)?..а так можно было бы по ошибке (CF=1) определить отсутствие в системе устройства |
| Автор: SABROG 10.1.2008, 23:38 |
| Сомневаюсь что это для любых устройств. А можно почитать задачу слово в слово ? Просто все прерывания так или иначе имеют заглушки. Причем они скорее всего разные для ДОСа и Windows. |
| Автор: Akina 10.1.2008, 23:39 |
| SABROG дал правильный путь. Во-первых, ты можешь определить сам факт наличия или отсутствия обработчика. При отсутствии вектор будет (во всяком случае должен быть) нулевой. Во-вторых, если обработчик есть, ты можешь определить, находится обработчик в ROM компьютера, ROM расширения или в RAM. По адресу точки входа. В третьих, если обработчик в RAM, ты можешь определить, установлен он как драйвер устройства или как резидентный обработчик. И даже, возможно, определить имя модуля, из которого он установлен. По принадлежности MCB. Вот, пожалуй, и все... |
| Автор: xach 10.1.2008, 23:54 | ||||||
вы в этом уверены?..ведь процессор делает переход по факту аппаратного прерывания...представляю что получится если он перейдёт на адрес 0000h...
а какой диапазон адресов ROM?
это лишнее (с учётом задачи) SABROG, как таковой задачи нет, она была озвучена мне устно: определить у каких аппаратных прерываний есть обработчик. Очень не корректно поставленная задача...скорее всего имелось ввиду отличить неиспользуемые устройства, от используемых. Всё для чистого dos. |
| Автор: SABROG 11.1.2008, 00:16 | ||
Запусти ДОС и посмотри, ты же вроде написал вывод обработчиков ? Под виндой то там все перехватывается. Если действительно будут нули, то твоя задача решена. Вот распределение памяти, пните меня, если я ложанулся |
| Автор: Akina 11.1.2008, 00:25 |
Нет, не лажанулся, все верно. Но тут все крупными мазками, ему надо (?) более детально. С учетом массы спецификаций (см. напр. описание технологий QEMM), позволяющих переадресовывать блоки оперативной памяти в незанятую область верхней памяти и в видеопамять граф. режима (А000-В7FF). Например, обработчик прерывания с адресом C200:0005 может быть как в ROM, так и в RAM. И в любом из этих случаев он может быть заглушкой. Добавлено через 4 минуты и 10 секунд Для CPU - да. А для FPU - само собой нет. |
| Автор: xach 11.1.2008, 00:58 |
| 1 - я переправил прогу. теперь она выводит номера тех прерываний, у который пара сегмент:смещение (считанные по вектору) равны нулю 2 - загрузился с дискеты под дос ни одного прерывания с парой 0000h:0000h нету...хотя устройства у меня не все (взять хотя бы стриммер) |
| Автор: Akina 11.1.2008, 09:24 | ||
xach напишите простейший код, который можно подсунуть вместо бут-сектора дискеты и выводящий текущее состояние векторов, что-то типа:
закатайте его в бут-сектор, загрузитесь и посмотрите состояние векторов. На момент старта ОС... |
| Автор: SABROG 11.1.2008, 09:52 |
| Я тоже об этом думал, но все-таки таким образом не узнать какие вектора не будут никогда вызываться, потому что нет устройств которые генерировали бы IRQ. И потом я думаю никакой преподаватель не станет подобное задавать. Скорее всего где-то недопонимание. |
| Автор: Akina 11.1.2008, 12:54 |
что-о-о??? таймер-клавиатура-сопроцессор-прочая дрянь... |
| Автор: SABROG 11.1.2008, 13:08 |
| Да нет, все 2 контроллера врятли используются на полную. Т.е. есть свободные IRQ на которых не висит пока ничего. Как узнать человеку, что IRQ свободен ? Опрашивать вручную все известные порты ? |
| Автор: xach 11.1.2008, 16:57 |
| ух...получил я зачёт...достало это СПО, из-за него нормальным и интересным ни чем не заняться =(...но вот теперь-то можно будет вернуться к теме music in dos!.. Всем спасибо за помощь! |
| Автор: Akina 11.1.2008, 18:41 |
Сведения о выделении аппаратных прерываний находятся в таблицах БИОС - ведь эта инфа, об использовании распределяемых IRQ, выводится таблицей при старте компа... в принципе надо сканировать DMI, но уж больно гиморно и реализационно-зависимо. |
| Автор: SABROG 11.1.2008, 18:49 | ||
Ну вот я потому и говорю, подобные задачи на дипломные работы скорее тянут, чем на курсовые |
| Автор: xach 11.1.2008, 22:46 |
| SABROG, это не курсовая, а дополнительное задание к лабораторным. |
| Автор: SABROG 12.1.2008, 00:20 |
| Тем более, тут достаточно человеку рассказать почему не получилось определить, какие попытки предпринимались и что мешало, после такого доклада не только зачет бы поставили, да еще бы похвалили и поставили другим в пример |
| Автор: MAKCim 12.1.2008, 15:52 |
просмотреть таблицу перенаправлений APIC все, что замаскировано, то не используется |
| Автор: SABROG 12.1.2008, 15:59 |
| Я думал об этом, но не был уверен (да и сейчас не уверен), к тому же мало ли кто замаскировал прерывание. |
| Автор: MAKCim 12.1.2008, 16:31 |
да, такая ситуация возможна линия IRQ может быть замаскирована если она не используется или активен обработчик соответствующего прерывания можно попробовать просканировать таблицу несколько раз через некоторые промежутки времени |
| Автор: xach 12.1.2008, 16:41 |
| MAKCim, если обработчик активен, то твоя прога не активна и нестыковки не произойдёт... c unix.ginras.ru: Функция APIC предоставила возможность без конфликтов работать двум устройствам на одном IRQ. Работая в паре, эти две опции прекрасно дополняют друг друга и "разводят" конфликлы оборудования на почве IRQ. НО! Процесс этот закрыт и на него нет специфической документации. Основное при работе ACPI и APIC - это таблица DSDT, определяющая правила их работы. Она имеется в любой прошивке BIOS в бинарном виде. Intel открыла спецификацию на свои материнские платы и на алгоритм работы ACPI и APIC. Остальные производители - нет. eof а как эту таблицу DSDT посмотреть и где она лежит? |
| Автор: MAKCim 12.1.2008, 17:29 | ||||||||
неа чисто гипотетически допустим в обработчике происходит исключение и управление передается на другой участок кода в котором идет проверка APIC т. к обработчик прерывания не завершен, то и соответствующая линия IRQ может быть замаскирована
да, и что?
только в BIOS, который поддерживает ACPI кроме того DSDT ничего не определяет в ней содержится AML код, интерпретируемый AML-интерпретатором ядра (в случае если система является ACPI-совместимой) возможно, вы имели в виду MADT (Multiple APIC Description Table) Добавлено через 6 минут и 7 секунд
RSDP содержит указатель на RSDT RSDT содержит адреса других таблиц, в том числе и DSDT |
| Автор: xach 12.1.2008, 17:38 | ||
это я для полноты описания. возможно...как я понял есть таблица в которой прописано какие устройства присутствуют, а какие - нет. точнее на какие из них нужно генерировать прерывание, а на какие - нет. |
| Автор: MAKCim 12.1.2008, 17:41 | ||
нет она описывает APIC-и (Local APIC, I/O APIC, Local SAPIC, I/O SAPIC) |
| Автор: xach 12.1.2008, 17:56 |
| т.е. по адресу 40:0Eh лежит 2-х байтовый RSDP, по какому-то смещению лежит RSDT, который укажывает на таблицу в которой тоже по какому-то смещению лежит DSDT?.. а при использовании 2-х байтного указателя юзать так: 0:ptr? т.е. сегмент=0, а смещение этому 2-х байтному указателю? |
| Автор: MAKCim 12.1.2008, 18:09 | ||
нет вот код поиска RSDP
|
| Автор: SABROG 13.1.2008, 12:37 | ||
Если в RSDP -> RSDT -> DSDT, а
То зачем вы ищите вообще RSDP ? |
| Автор: MAKCim 13.1.2008, 13:40 |
MADT находится через RSDT, как и DSDT |
| Автор: SABROG 13.1.2008, 14:30 |
| Похоже еще придется учитывать все спецификации ACPI, определять каким-то образом. Вот тут http://acpi.info/presentations/S01USMOBS169_OS%20new.ppt перечеркивается старая структура RSDP и определяется новая. Получается в данный момент мы можем адаптироваться только под один вид платформы. Реально это уже такие дебри пошли, которые на диплом потянут |
| Автор: MAKCim 13.1.2008, 17:04 |
поле Revision в RSDP |
| Автор: xach 13.1.2008, 21:09 |
| MAKCim, а нет ли какой-нибудь информации об этих всех указателях, структурах, их адресах, их поиске (если они начинаются (как было описано выше) с сигнатуры) и т.д.? |
| Автор: MAKCim 13.1.2008, 21:15 |
| http://www.acpi.info/DOWNLOADS/ACPIspec30b.pdf |
| Автор: mb78 12.7.2008, 21:40 |
| Решали какие DOS ,какие Bios ,разработчки компьютеа IBM.Поэтому что есть что легче всего узнать из описания. докуметации. В универе можете сказать,что программно это не определить,за исключением того случая ,если сразу тоит iret а если надо просто выяснить ,то MS-DOS это int &H21, остальные ,по-моему до &H60-го -Bios |
| Автор: AndNot 14.7.2008, 20:34 |
| Ну надо же, даже до ACPI добрались, хотя задача в принципе решается проще |
| Автор: Evgeniy22 6.2.2010, 22:05 |
| подскажите пожалуйста как с помощью ACPI выключить комп, тоесть перевести его в состояние G3. Все таблицы и адреса регистров я нашёл. Функцию ресет тоже сделал. С языком AML не разбирался... Подскажите как сделать это и нужно ли для етого знать AML? |