dmitriy писал(а):
SII писал(а):
Не совсем верно. Насколько помню (а если ошибусь, знающие поправят), в архитектуре IA-32 (x86) при входе в обработчик прерывания (независимо от того, в каком режиме) сохраняются только адрес команды (пара регистров CS:IP, если говорим о реальном режиме) и регистр флагов (FLAGS), а отнюдь не все регистры. Остальные регистры при необходимости сохраняет обработчик прерывания, он же отвечает и за их восстановление.
Вы ошибаетесь. в реальном (не защищенном) режиме обработчик прерывания сохраняет регистры AX BX CX DX SI DI ES DS CS IP регистр флагов (FLAGS) не помню только в какой последовательности. это точно сам проверял.
Вообще-то я не ошибаюсь и пишу чёрным по белому: все регистры, кроме адреса команды (CS:IP) и флагов, сохраняет обработчик (а не процессор), причём обработчик
не обязан записывать эти регистры в стек или куда-нибудь ещё, если их не меняет. Он обязан (в общем случае) лишь обеспечить их неизменность, а как этого добьётся -- это его сугубо личное дело. Например, если для обработки некоторого прерывания обработчику достаточно регистров AX и DX, он может сохранить только их и не тратить время на сохранение/восстановление остальных регистров:
Код:
Intr_Enrty: push ax
push dx
обработка прерывания
pop dx
pop ax
iret
Другое дело, что проще сделать pusha в начале и popa в конце, сохранив-восстановив все 7 регистров общего назначения. Но эти команды отсутствовали в 8086/88, там приходилось отдельными push/pop (понятно, сейчас это неактуально, разве что если кто страдает некрофилией и пишет именно под 8086).
Цитата:
SII писал(а):
Сохраняется та же информация (адрес команды + флаги), плюс иногда код прерывания. Вход в обработчики осуществляется с помощью описателей (дескрипторов), которые собраны в таблицу IDT, положение которой в памяти задаётся регистром IDTR; в него надо загрузить корректную информацию (правильный адрес уже сформированной таблицы) до разрешения прерываний. Подробностей не помню, читайте документацию на архитектуру -- там всё достаточно подробно описано.
Не совсем верно. Прерывания общей защиты (когда в память не туда залезишь, или полномочий не хватает и т. д) еще сохраняют код ошибки. Какие именно (прерывания) не где найти не могу.
Я код ошибки обозвал кодом прерывания -- не помню, как оно у Интела называется; у каждой архитектуры своя терминология. А искать, естественно, в описании архитектуры IA-32, в третьей её части -- именно там описывается всё, что касается системной архитектуры (прерывания, состояния, переключения туда-сюда-обратно и т.д. и т.п.).
Цитата:
Реальный (не защищенный) режим я знаю. Проблем с ним у меня не возникало. Только в реальном режиме уже есть прерывание (в BIOS)и достаточно много. То бишь не загружая не какой системы уже можно опрашивать клавиатуру, записывать\стирать с диска, выводить на экран и т.д И все это не программируя прерываний
А вот надо уметь программировать всё это самому, не полагаясь на BIOS, и только затем лезть в защищённый режим. Если попробовать сразу совместить одно с другим, лишь создадите себе лишние проблемы (попробуй догадайся, из-за чего всё висит: неверно запрограммирован контроллер прерываний? кривой дескриптор в IDT? кривой TSS? один стек затирает другой? ну и т.д. и т.п.)