2017-02-13 21 views
5

Я разрабатываю встроенную программу для i386 intel, и я пытаюсь понять, как использовать аппаратный таймер. Я прочитал here (и другие места), что прерывание таймера - 0x08, но this page (И другие источники) говорят, что первые 32 прерывания зарезервированы для исключений, а прерывание 0x08 специально для двойной ошибки. Что является правдой? Как настроить обработчик прерывания таймера, используя либо сборку, либо очень низкий уровень C без вызовов операционной системы?Как прерывание таймера должно быть 0x08, если первые 32 прерывания зарезервированы для исключений?

Я разрабатываю простую операционную систему, чтобы узнать о разработке операционной системы, поэтому у меня нет доступа к чему-либо подобному Linux или системным вызовам (если только я не реализую системные вызовы самостоятельно. Но создание полностью совместимой с POSIX ОС далеко за пределами этого проекта, поэтому я предпочел бы придерживаться простых, хотя и слегка взломанных решений).

Если это имеет значение, я запускаю это на QEMU, а не фактическое физическое i386.

+2

Вы обычно переназначаете прерывания. См. Статью [osdev article] (http://wiki.osdev.org/8259_PIC). – Jester

+0

Намерены ли вы записать режим реального режима или защищенный режим? Я предполагаю защищенный режим. –

+0

@MichaelPetch Поскольку я не знаю, что это значит, я полагаю, что я должен принять то же самое, что и вы. (Я посмотрю, что это значит и вернется к вам) – ItsTimaiFool

ответ

2

Большинство людей считают это (использование таймера с использованием INT8) ошибкой дизайна в оригинальной архитектуре IBM PC. Чтобы (частично) защитить виновных, оригинальный 8088 действительно не использовал этот вектор - он был, однако, отмечен как «зарезервированный» Intel с самого начала.

Прежде чем был изобретен защищенный режим, этот конфликт на самом деле не наступил (CPU < 80286 не использовал эту двойную ошибку). На большинстве современных ПК 8259 PIC все еще существует, хотя и не как отдельный чип, а где-то в чипсете ПК. К счастью, INT08 для прерывания таймера не вырезается на аппаратном уровне, а скорее инициализируется в ПОС BIOS компьютера. Таким образом, ОС защищенного режима может легко перегруппировать прерывания PIC в другие, более удобные места, чтобы избежать конфликта. Насколько мне известно, только DOS и другие ранние операционные системы предполагают прерывание таймера на INT8.

+0

Это наоборот: IRQ0 разрешалось сопоставлять с вектором 08, потому что он не использовался (это не является недостатком 8086). #DF [отсутствовал в исходном 8086 (виртуальный PDF Page 40)] (https://edge.edx.org/c4x/BITSPilani/EEE231/asset/8086_family_Users_Manual_1_.pdf). Было бы неплохо включить такую ​​схему в ваш вопрос :) –

+0

@MargaretBloom: Реальность такова, что вектор 08h не был «неиспользуемым». Фактически он был указан как ** зарезервирован ** полностью на документах спецификации дизайна Intel Intel на 8086/8088 зарезервировала первые 32 interrurpt вектора. Проблема в том, что IBM проигнорировала Intel и фактически использовала зарезервированные векторы для 8259. Это вызвало проблемы при выходе 80286 и 80386 (столкнулся вектор сопроцессора и столкновение 8259A) Если бы IBM не разработала ошибочную систему с самого начала и не соответствовала Intel, этот кластер frack бы не произошел –

+0

@MargaretBloom: Если вы просмотрите [iAPX 86 и 88 руководство Intel] (http://www.mirrorservice.org/ сайты/www.bitsavers.org/PDF/Intel/_dataBooks/1981_iAPX_86_88_Users_Manual.pdf) с 1981 года, страница 4-17 представляет особый интерес. Этот переход Как показано на рисунке 4-18, первые пять векторов прерывания связаны с инициируемыми программным обеспечением прерываниями и аппаратным немашируемым прерыванием (NMI) , Следующие 27 векторов прерываний: , зарезервированные Intel и не должны использоваться, если совместимость с будущими продуктами Intel должна быть сохранена. _ –