OSDev

для всех
Текущее время: 28 мар 2024, 23:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Прерывания 0x00 - 0x07
СообщениеДобавлено: 31 май 2014, 17:19 

Зарегистрирован: 26 май 2014, 17:09
Сообщения: 9
Где можно увидеть(найти) реализацию обработчиков для прерываний 0x00 - 0x07?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания 0x00 - 0x07
СообщениеДобавлено: 31 май 2014, 17:41 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Да много где.
Исходники DOS 1, 2 открыты.
Исходники DOS 6.0 утекли в сеть.
Исходники Windows NT4 и Win2k тоже утекли в сеть.
Исходники Microsoft Invisible Computing platform открыты.
Исходники FreeBSD открыты
Исходники Linux открыты.
Исходники Intel UEFI DUET открыты.
Исходники L4 открыты.
Исходники QNX 3 открыты.
Исходники FreeDos открыты.

Есть ещё много всяких статей и других ОС, но в списке приведены основные ОС которые стоит рассмотреть так как при их разработке использовался профессиональный подход или полу профессиональный.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания 0x00 - 0x07
СообщениеДобавлено: 31 май 2014, 18:02 

Зарегистрирован: 26 май 2014, 17:09
Сообщения: 9
pavia писал(а):
Да много где.
Исходники DOS 1, 2 открыты.
Исходники DOS 6.0 утекли в сеть.
Исходники Windows NT4 и Win2k тоже утекли в сеть.
Исходники Microsoft Invisible Computing platform открыты.
Исходники FreeBSD открыты
Исходники Linux открыты.
Исходники Intel UEFI DUET открыты.
Исходники L4 открыты.
Исходники QNX 3 открыты.
Исходники FreeDos открыты.

Есть ещё много всяких статей и других ОС, но в списке приведены основные ОС которые стоит рассмотреть так как при их разработке использовался профессиональный подход или полу профессиональный.


А разве эти прерывания не код BIOS-а настраивает? Просто судя по вашему ответу это задача ОС. Просто я в учебных целях пишу простенький BIOS(без всяких ОСей) и хотел бы, чтобы прерывания 0x0 - 0x0F были рабочими. А вы мне предлагаете смотреть исходники ОС.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания 0x00 - 0x07
СообщениеДобавлено: 31 май 2014, 18:46 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Вы как-то не уточнили внешние или внутренние прерывания? Внутренние делятся на ловушки и исключения. Специфика обработки разная. Во вторых одно дело делать обработку прерываний для ОС и другое дело обработку для BIOS. Мы же на сайте посещенным разработке ОС, а не БИОС. Надо было просто уточнить.

Есть много исходников БИОС

исходники BIOS IBM AT (80286) утекшие или дизассемблированные
исходники BIOS Award (в 2-х модификациях) утекшие
исходники LinuxBios открытые
исходники Intel Duet (о них уже писал выше) открытые
и др.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания 0x00 - 0x07
СообщениеДобавлено: 31 май 2014, 21:25 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Существует несколько стратегий для обработки прерываний.
1. Не устранять причину прерывания.
2. Устранить причину прерывания.
3. Вызвать того кто знает, что делать с причиной прерывания.

Откуда можно выделить разные источники прерываний. Есть те для которых легко написать обработчик и они известны. Вторые те для которых невозможно ничего сделать. И по серёдке лежат все остальные. Так что-же делать с оставшимися? Как правило в системе есть элемент и он не знает всей информации. Поэтому он не может принять верного решения, что делать. Но зато он может по иерархии отдать выше стоящему элементу который уже будет располагать большей информации и сможет обработать прерывание. Либо передать тому, кто сможет это сделать.
Как правило на самом верху находится человек.
Средне статистический человек не является специалистом. Поэтому он не может принять верного решения. Поэтому на ПК как правило все решения принимает компьютер.

Внизу лежит BIOS так как он знает меньше всех. Чуть выше лежит ОС, чуть ниже ОС встроенные драйверы. Чуть выше внешние драйвера и сервисы, затем приложения, отладчик, человек. Внутри каждой программы идут свои уровни.
Отсюда кстати и классификация исключений согласно документации Intel

Исключения классифицированы как: ошибки (faults), ловушки(tarp), и аварийные прекращения работы (aborts) в зависимости от способа, которым о них сообщают и может ли команда, которая вызвала исключение, быть перезапущена без потери непрерывности задачи или программы.


• Ошибки - ошибка - исключение, которое может быть исправлено до наступления ошибки, позволяет программе быть перезапущенной без потери непрерывности. Когда об ошибке сообщают, процессор восстанавливает состояние машины к состоянию до начала выполнения ошибочной команды. Адрес возврата (сохраненное содержание регистров CS и EIP) для обработчика ошибки указывает на ошибочную команду, а не на команду после сбойной команды.

• Ловушки - ловушки - исключение, о котором сообщают немедленно после выполнения команды попавшей в ловушку. Ловушка позволяет выполняющейся программе или задаче быть продолженной без потери непрерывности программы. Адрес возврата для обработчика ловушки указывает на команду, которая выполняется после команды попавшей в ловушку.

• Аварийные прекращения работы - аварийное прекращение работы - исключение, которое не всегда сообщает о точном местоположении команды, вызывающей исключение и не позволяет выполнить рестарт программы или задачи, которая вызвала исключение. Аварийные прекращения работы используются, чтобы сообщить о серьезных ошибках, типа ошибок аппаратных средств и несовместимых или неправильных значениях в системных таблицах.

Примечание

Некоторые исключение из подмножества Ошибок не позволяют восстанавливать работу. Такие исключения приводят к потере некоторых состояний процессора. Например, выполнение команды POPAD, где структура стека пересекает конец сегмента стека, заставляет проинформировать процессор об ошибке. В этой ситуации обработчик исключений видит, что указатель (CS:EIP) команды был восстановлен, как будто команда POPAD не выполнялась. Однако, внутреннее состояние процессора (универсальные регистры) будет изменено. Такие случаи рассматривают, программируя ошибки. Приложение, вызвавшее этот класс исключений должно быть закончено, остановлено операционной системой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания 0x00 - 0x07
СообщениеДобавлено: 31 май 2014, 22:37 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Понимаю что выше сказанное довольно абстрактно и не понятно. Но приводить несколько примеров мне лень. Поэтому если будут вопросы то спрашивайте.

Опишу как есть сейчас.
BIOS
|INT| Description | Status |
|00 | Divide by zero | Not Supported |
|01 | Single step | Not Supported |
|02 | Non-Maskable interrupt | Supported |
|03 | Breakpoint | Not Supported |
|04 | Overflow | Not Supported |
|05 | Print Screen Interrupt | Supported |
|06 | 286 LoadAll Handler | Supported |
|07 | Reserved | Not Supported |
|08 | IRQ0 - System Timer Interrupt | Supported |
|09 | IRQ1 - Keyboard Interrupt | Supported |
|0A | IRQ2 - Reserved | Not Supported |
|0B | IRQ3 - COM2: Interrupt | Supported |
|0C | IRQ4 - COM1: Interrupt | Supported |
|0D | IRQ5 - LPT2: Interrupt | Supported |
|0E | IRQ6 - Floppy Disk Interrupt | Supported |
|0F | IRQ7 - LPT1: Interrupt | Supported |
|70 | IRQ8 - Real time clock interrupt | Supported |
|71 | IRQ9 - IRQ2 redirection | Supported |
|72 | IRQ10 - Reserved | Not Supported |
|73 | IRQ11 - Reserved | Not Supported |
|74 | IRQ12 - Available/PS/2 Mouse | Supported |
|75 | IRQ13 - Math coprocessor | Supported |
|76 | IRQ14 - Primary IDE HDD | Supported |
|77 | IRQ15 - Available/Secondary IDE HDD |Supported |

BIOS обрабатывает не все прерывания.
Для поддержания работы он игнорирует прерывания PCI. Особенно от карт расширения.
Так же он поступает с исключениями которые совпадают с прерываниями. На самом деле это косяк разработчиков IBM.
А вот игнорировать IRQ1, IRQ12 не может так как иначе контроллер 8042 перестанет работать. Обработчик обязан прочитать из 60h порта что бы разрешить прерывания.

|00 | Divide by zero | Not Supported |
|01 | Single step | Not Supported |
|03 | Breakpoint | Not Supported |
|04 | Overflow | Not Supported |

BIOS не может обработать так как не знает что с ними делать.
Самое лучшее это вывести сообщение о ошибке и зависнуть в цикле. Как я говорил оставить на совести специалиста. Но в критических системах лучше всего их проигнорировать и попытаться восстановить управления. К примеру перезагрузиться, как это делает это WINDOWS с выводом BSOD(синий экран смерти)

Любая DOS программа написанная на BorlandPascal перехватывает следующие вектора.

SaveInt00: Pointer; { Saved interrupt $00 } { ! }
SaveInt02: Pointer; { Saved interrupt $02 }
SaveInt1B: Pointer; { Saved interrupt $1B }
SaveInt21: Pointer; { Saved interrupt $21 }
SaveInt34: Pointer; { Saved interrupt $34 }
SaveInt35: Pointer; { Saved interrupt $35 }
SaveInt36: Pointer; { Saved interrupt $36 }
SaveInt37: Pointer; { Saved interrupt $37 }
SaveInt38: Pointer; { Saved interrupt $38 }
SaveInt39: Pointer; { Saved interrupt $39 }
SaveInt3A: Pointer; { Saved interrupt $3A }
SaveInt3B: Pointer; { Saved interrupt $3B }
SaveInt3C: Pointer; { Saved interrupt $3C }
SaveInt3D: Pointer; { Saved interrupt $3D }
SaveInt3E: Pointer; { Saved interrupt $3E }
SaveInt75: Pointer; { Saved interrupt $75 }

Это так называемые run time error по русски ошибки времени исполнения. Это те ошибки которые программа может обработать либо не обработать. Если бы программа их не перехватывала то управление досталось бы ОС которая могла бы убить приложение и продолжить свою работу. Есть такое понятие как борьба за живучесть Или устойчивость системы.
Но как правило среди программистов считается важнее просигнализировать о ошибке. Хотя лично моё мнение я бы по больше доверял автоматике.

А вот Turbo Debuger перехватывает
<01,03,09,10,13>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания 0x00 - 0x07
СообщениеДобавлено: 31 май 2014, 23:00 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Ошибка Divide by zero. Если BIOS как правило её игнорирует. Что приводит к зависанию и не правильно. То программы написанные на Borlan Pascsal выводят сообщения о ошибке и после нажатия клавиши аварийно завершают работы программу и выходят в DOS.
То вот что предлагается в книге "Л. Скэнлон__Пер._с_англ._И._В._Емелин_М.-Персональные_ЭВМ_IBM_PC_и_XT._Программирование_на_языке_ассемблера-Радио_и_связь(1989)"
Автор предлагает перехватить ошибку и устранить её. Правда такое устранение не всегда возможно поэтому в книжке рассматривается только один случай, а именно случай переполнения когда 256..65535 при деление на малое число 1..255 не влазит в восьмибитный результат.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB