Путаница в таблице пользовательских дескрипторов прерываний

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

В вики OS Dev говорится, что the first 32 (0-31) interrupts are reserved and used by the CPU, as exceptions, so don't use those for APIs or IRQs. Дело в том, что если я загружаю свою пользовательскую таблицу прерываний, разве мне не нужно предоставлять записи для всех этих прерываний?

Кроме того, в вики указано, что BIOS отображает IRQ0-7 на прерывания 8-15. Если это так, не будут ли прерывания IRQ конфликтовать с зарезервированными прерываниями?

Есть что-то, что я не получаю? Прерывания 0-31 в отдельной таблице или что-то в этом роде? Кто-нибудь, пожалуйста, укажите мне правильное направление и проясните ситуацию.


person Alex Nichol    schedule 25.07.2011    source источник


Ответы (2)


Когда написано don't use those [interrupts 0-31] for APIs or IRQs, это означает, что вы не должны использовать их для какой-либо функции, кроме исключений, для которых они зарезервированы. Вам нужно определить обработчики для этих прерываний, чтобы вы могли обрабатывать исключения, когда они происходят. См. страницу исключений OSDev для получения списка исключений с их номером прерывания и описанием.

Когда процессор запускается, он находится в реальном режиме. В этом режиме меньше исключений, поэтому для их обработки зарезервировано меньше прерываний. Пока процессор находится в реальном режиме, безопасно использовать прерывания 8-15 для IRQ. Прежде чем включить прерывания в защищенном режиме, вам необходимо переназначить IRQ на другие прерывания. См. раздел Инициализация документа страница OSDev PIC (программируемый контроллер прерываний) для получения информации о том, как это сделать.

person ughoavgfhw    schedule 25.07.2011

первые 32 (0-31) прерывания зарезервированы и используются ЦП в качестве исключений, поэтому не используйте их для API или IRQ.

Речь идет о том, КТО может выдать прерывание. 0-31 предназначены для событий самого ЦП (внутренние, например, ошибка страницы, деление на ноль..), а другие — для внешних событий (аппаратные инициации, например, нажатие на клавиатуру, прерывание PCI и т. д.). Это не про ИДТ. Вы должны указать все прерывания в таблице.

person osgx    schedule 25.07.2011