| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Windows/Dos > Защищённый режим |
| Автор: JAPH 4.2.2007, 16:46 | ||||
Привожу программку, которая умудряется перевести процессор в защищённый режим, вывести на экран энное количество восклицательных знаков, перевестись обратно в реальный режим и корректно передать управление обратно DOSу.
Так вот. Хочется раскомментировать строку ;sti, чтоб в PM обрабатывать прерывания таймера и клавиатуры (для начала по векторам 8 и 9). Но все мои попытки как-то это организовать проваливались. Даже такой безобидный вариант: в IDT заменить 8 и 9 шлюзы прерываний на нечто, указывающее на код (в сегменте codes)
Так как повела себя прога: не дойдя до вывода восклицательных знаков, прошла шаги 4, 5, 6 (в смысле, показала эти цифры) и перезагрузила комп (вероятно, из-за sti). Что это было? Что сделала iret? iretd тоже не помогла - перезагрузка и всё тут. Как правильно? Если убрать первые две строки в обработчике, прога отрабатывает и даже передаёт управление DOS, но клавиатура в результате просто игнорируется. Итак, просьба-вопрос: написать простейший обработчик прерываний 8 и 9 (желательно использовать шлюзы прерываний), так, чтобы: прерывание 8 не выполняло никакой полезной работы - пример пустого обработчика; прерывнаие 9 выводило по адресу dword ptr 000B80A0h (через fs) scan-код клавиши-причины прерывания в hex-виде. Хочется увидеть полный код. |
| Автор: MAKCim 4.2.2007, 18:34 |
| эх, написал бы, но только на GAS |
| Автор: JAPH 4.2.2007, 20:12 |
| Напишите, объясните отличия от TASM, может, уловлю и синтаксис, и идеи. А если не уловлю, наверняка найдётся кто-нибудь, способный перевести код на TASM. |
| Автор: MAKCim 4.2.2007, 22:41 | ||
|
| Автор: JAPH 5.2.2007, 00:02 | ||
| Пытаюсь что-нибудь понять... Вопросы такие: 1. Можно код обратного перепрограммирования контроллера прерываний? То же самое, только в строках 22-25
так? (Задно проверяйте понимание синтаксиса) 2. Почему в строке 19 именно 15h, а не 11h, как у Пирогова? Что есть остальное? Как контроллер отличает различные ICW/OCW, или они посылаются в определённом порядке, тогда в каком? Может, поясните именно этот пример, описание самих CW у меня есть, но связей между ними - нет. 3. Можно ли обойтись без перепрограммирования, то есть можно ли различить, прерывание 8 вызвано из-за таймера или двойной ошибки? По младшему биту кода ошибки? Хотя прерывание таймера не помещает код ошибки в стэк, не должно, так ведь? Может, пользоваться шлюзом задачи и отслеживать ESP - есть код ошибки или нет? 4. В 17ой строке опечатка? |
| Автор: JAPH 5.2.2007, 13:12 |
| Ну, как это зачем? Когда прога выйдет из PM, она должна корректно передать управление DOS. А тут по первому прерыванию от таймера INT 20h! Насчёт #GP при подмене шлюза прерывания на ловушки - судя по тому, что они отличаются друг от друга только разрешением/запретом прерываний во время работы обработчика, не будет. По поводу стэка - получается, что никто не контролирует, выйдем мы за 512 байт или нет. Вот я и удивился. По поводу Я читал, что IDT может содержать только шлюзы прерываний, ловушек и задач. А что на самом деле? |
| Автор: MAKCim 5.2.2007, 13:23 | ||||||
а, ну если в этом смысле, тогда да
ну это же пример, думаю 512 байт вполне достаточно, нет - пожалуйста, делай отдельный дескриптор для стека и пр.
так оно и есть просто если тебе надо узнать, произошло исключение или прерывание, то нужно узнать ESP для CPL = 0, а он находится в TSS текущей задачи |
| Автор: JAPH 5.2.2007, 14:09 | ||
Прицепил перепрограммирование контроллера до и после. Теперь проблема такая: после возврата в DOS набрать что-либо в командной строке не удаётся - клавиатура игнорируется. Причём раскомментирование sti и/или комментирование mov al, 20h | out 20h, al исхода не меняет. Чего я недоглядел?
|
| Автор: MAKCim 5.2.2007, 17:46 |
так ты sti делаешь только перед int 21h, а в here: делаешь cli |
| Автор: JAPH 5.2.2007, 18:59 |
| А что тут такого? Раскомментировать строку 59? Не поможет. Так как надо? Почему DOS после отрабатывания программы не воспринимает клавиатуру? Куда делся обработчик INT 09h? Если убрать перепрограммирование, всё в порядке. |
| Автор: MAKCim 5.2.2007, 19:06 | ||||||
причем тут строка 59 насколько я понял переход в реальный режим тут
далее в back (читай комментарии)
|
| Автор: JAPH 5.2.2007, 20:03 |
| Если оставить только конечное перепрограммирование, та же проблема. Что касается последнего lidt, он должен загрузить в IDTR его значение в реальном режиме, то есть базу 0 и предел 03FFh. Я так понял, тут то же, что заставляет прописывать в CS и SS нечто с лимитом 0FFFFh для выхода из PM. (Я сначала забыл про это - заработал перезагрузку) И всё же, чем мешает cli? Это не должно влиять на контроллер. Разрешить прерывания я решаюсь только после закрытия A20 и разрешения маскируемых прерываний. Конечно, можно перенести перепрограммирование поближе к sti, но что это изменит? |
| Автор: MAKCim 5.2.2007, 20:36 | ||||
в реальном режиме процессор регистр LDTR вообще не смотрит а обращается напрямую к таблице векторов прерываний по 0000:0000h, такова логика
Нет, конечно на контроллер это не влияет однако, сделав cli, процессор не реагирует на сообщения контроллера о возникновении прерываний => процессор не начинает их обработку |
| Автор: JAPH 5.2.2007, 20:41 |
| Ну дык перед выходом из программы происходит sti. По идее, ОС уже должна реагировать на прерывания? |
| Автор: MAKCim 5.2.2007, 20:47 | ||
ну и? программа то завершается, о каких тогда нажатиях на клавиатуре идет речь? (или я чего-то не понимаю) Кстати, такой вопрос, как сей код ты запускаешь? |
| Автор: JAPH 5.2.2007, 21:11 | ||||
Итак. Загружаюсь под голым DOS-ом, т.е. комп работает в реальном режиме. В командной строке
Прога отрабатывает, появляется
но набрать "win" не удаётся - клава игнорируется! |
| Автор: MAKCim 6.2.2007, 13:05 |
| покажи участок кода, который должен выполняться в момент генерации прерывания |
| Автор: JAPH 6.2.2007, 13:28 | ||
В какой момент какой генерации прерывания? На протяжении всей работы программы прерывания запрещены - от cli в строке 131 до sti перед самым выходом! Привожу полный текст ошибочной программы:
|
| Автор: MAKCim 6.2.2007, 13:42 | ||
блин ну и чего ты тогда хочешь, каким макаром у тебя будет ловится IRQ1, если IF = 0 после перехода в protected mode и перерограммирования контроллера делай sti, перед возвратом в real mode делай cli, далее переходи в real mode, обратно перепрограммируй контроллер и сразу делай опять sti |
| Автор: JAPH 6.2.2007, 14:00 |
| Так надо правильно перепрограммировать контроллер! Если даже просто отдельной программой перепрограммировать его на прерывания 8 и 70h, клавиатура перестанет распознаваться, процессор перестанет реагировать на IRQ1 и наверняка на IRQ0 тоже! Ошибка в строках 173-189. Если их убрать, всё нормально. Я добиваюсь того, чтоб после работы программы (неважно, что конкретно она творит, главное, что перепрограммирует контроллер) операционная система распознавала INT 9! На вашем компьютере этот код не вызывает таких проблем? |
| Автор: MAKCim 6.2.2007, 14:40 |
на моем компьютере нет DOS у вас к тому же еще и не загрузочный модуль, так что проверить не могу |
| Автор: JAPH 6.2.2007, 16:32 |
| Контроллер прерываний у вас есть? Вы код перепрограммирования проверяли? Работает? Корректно? |
| Автор: MAKCim 6.2.2007, 17:15 | ||
не проверял но сведения взяты из Зубкова, не думаю, что там ошибка если хотите вот http://pdos.csail.mit.edu/6.828/2005/readings/hardware/8259A.pdf на оригинальную документацию Intel по 8259 I/O APIC |
| Автор: JAPH 6.2.2007, 20:39 | ||
Прочитал документацию. Действительно, всё верно. Так что sorry, ошибка и правда не здесь. Попробовал навесить обработчик для прерываний защищённого режима - заработал! Но DOS по-прежнему упрямится. Попробовал после второго перепрограммирования поменять обработчики реального режима на свои - работают! Но DOSу на это наплевать. Сохранил всю таблицу прерываний в начале программы и восстановил её перед выходом - никакого эффекта. Клавиатура по-прежнему не влияет на командную строку DOS. Ну что с этим делать! Итак, вопрос. Как восстановить работоспособность DOS после запуска следующего кода?
|
| Автор: MAKCim 6.2.2007, 22:04 |
| JAPH, а точно ли DOS ставит обработчики на 08h и 70h? есть подозрения, что причина в этом |
| Автор: JAPH 7.2.2007, 12:53 | ||
| Что IRQ0 на 08h - это точно. Насчёт 70h не знаю, но всюду написано, что на 70h. Цитирую:
|
| Автор: MAKCim 7.2.2007, 16:09 | ||
в реальном режиме попробуй заменить обработчик IRQ1 на свой, а из него вызвать оригинальный по адресу, записанному в 0000:0020h если не прокатит, есть подозрение, что код оригинального обработчика чем-то затирается в процессе работы твоей программы |
| Автор: JAPH 7.2.2007, 19:24 |
| Не прокатило. |
| Автор: MAKCim 8.2.2007, 00:17 | ||
тогда проведи такой тест перед переходом в protected mode сохрани первые 50 байт (или по своему усмотрению) обработчика IRQ9 в надежное место
перед выходом твоей программы просканируй на идентичность кода сохраненного обработчика и кода того обработчика который находится по адресу 0000:0024h |
| Автор: JAPH 8.2.2007, 14:58 | ||
| Первые 256 байт по адресу обработчика IRQ1 не изменились. Кстати, если перед выходом из программы заставить её ждать нажатия клавиши
система виснет. |
| Автор: MAKCim 9.2.2007, 18:35 |
не знаю тогда |
| Автор: JAPH 9.2.2007, 19:14 |
| Нда. Может, проблема в самой DOS и переустановка что-нибудь даст? Но до неё далеко. Может, кто-нибудь ещё потестирует код на своей DOS и расскажет о впечатлениях. А так, я думаю, вопрос исчерпан - в защищённом режиме всё идеально работает. Спасибо за участие |
| Автор: MAKCim 9.2.2007, 20:24 |
если у кого такой раритет будет |