Где происходит прерывание аппаратного таймера?

это таблица исключений и прерываний (которую я понимаю как IDT) из "Руководства разработчика программного обеспечения Intel Architecture"

Exceptions and Interrupts

где прерывание по таймеру, которое делает возможным переключение контекста? (для многозадачности)

Если это глупый вопрос, пожалуйста, исправьте мое понимание. заранее спасибо

Ответы

Ответ 1

Хорошо, да, если мы говорим о традиционном таймере 8254 PIT, то он находится в IRQ0, который является вектором 32. Но это обычно не используется в качестве таймера в операционной системе Linux на современных машинах. [Обратите внимание, что векторное присваивание 32 действительно довольно произвольно. Он задается при программировании 8259 (PIC) или APIC - но это не плохой выбор, так как 32 является первым вектором ПОСЛЕ зарезервированных. Это, безусловно, лучше, чем смешивать аппаратные прерывания с векторами исключений, поскольку DOS будет делать - так что не было возможности рассказать об общей ошибке защиты (вектор 13 в таблице выше) из INTR 5 (также вектор 13, когда INT0 был отображен к вектору 8 и 5 + 8 = 13). Из памяти INTR5 не был особенно хорошо использован - что-то вроде LPT2: (Второй параллельный порт). Но все же хорошая идея не перекрывать их... Henc "зарезервировано" для векторов с 20 по 31.

IRQ, который фактически контролирует синхронизацию системы, скорее всего, является локальным таймером APIC, и этот вектор не фиксируется на аппаратном уровне так же, как на исходном ПК.

Кроме того, с появлением "сигнальных прерываний с сообщением" вполне возможно иметь (намного) более 256 векторов прерываний.

Я не согласен с формулировкой "vector 0-19 - это не маскируемые прерывания". Помимо NMI (вектор 2), все они являются ИСКЛЮЧЕНИЯМИ (иначе TRAPS или FAULTS), то есть событие, вызванное некоторым условием ошибки в системном векторе, является результатом целочисленного деления на ноль, вектор 1 является "один шаг" прерывания команд [и несколько других "отладочных" ловушек, таких как "запись на любой адрес, соответствующий разрешенному регистру отладки" ], вектор 3 является результатом команды "int3" (код операции 0xcc), вектор 4 является результат выполнения "INTO" (что "o" как при переполнении, а не 0 как в ноле). При доступе к части памяти, не помеченной как присутствующая в таблицах страниц, используется вектор 14. Они действительно "не маскируются", но за некоторыми исключениями они непосредственно следят за выполнением инструктажа в то время, поэтому они синхронны с самой программой.

Исключение составляют исключение "двойная ошибка" и "ошибка проверки машины".

Двойная ошибка заключается в том, что процессор обнаруживает ошибку при обработке другого исключения - как правило, из-за того, что операционная система сделала что-то глупое, например, установила, что стек некорректен, и, таким образом, получает ошибку страницы, пытается использовать стек для сохранения адреса возврата страницы, и это не удается, потому что стек недоступен. Таким образом, двойные обработчики ошибок, как правило, устанавливаются как "прерывания переключения задач", и загружают новый стек, чтобы убедиться, что двойная ошибка может продолжаться. Если обработчик двойной ошибки не может работать правильно, процессор будет "тройной". Обычно это означает "перезагрузка" на платформах ПК. Двойные сбои обычно не восстанавливаются - обработчик (попытается) предоставить некоторую информацию о том, что произошло, и как он попал в это состояние, но как только это произойдет, система либо перезагрузится, либо ждет, когда кто-то придет, и нажмите reset кнопка.

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

Ответ 2

Вектор прерывания для промежуточного таймера аппаратного таймера - IRQ 0 = INT 32, поскольку он является внешним прерыванием.

0-19 являются немаскируемыми прерываниями, 20-31 должны быть зарезервированы Intel, 32-127 являются внешними прерываниями (IRQ). Аппаратное время должно быть подключено как IRQ 0, поэтому номер вектора должен быть здесь 32.

Ответ 3

Bit       Disable IRQ            Function
7          IRQ7             Parallel Port
6          IRQ6             Floppy Disk Controller
5          IRQ5             Reserved/Sound Card
4          IRQ4             Serial Port
3          IRQ3             Serial Port
2          IRQ2             PIC2
1          IRQ1             Keyboard
0          IRQ0             System Timer

Прочтите аппаратные прерывания, чтобы узнать больше об этом.

Ответ 4

Это действительно связанный с этим вопрос (это не соответствовало комментарию, поэтому, простите меня, разместите его здесь) в @Mats Petersson:

Вы хорошо объясняете ситуацию на современном hw (APIC). На современных >= 2.6 ОС Linux с прерыванием таймера, установленным для выполнения обычных "домашних" задач, традиционное понимание AFAIK, заключается в том, что прерывание таймера (возможно, IRQ0) срабатывает HZ раз в секунду (не считая CONFIG_NO_HZ aka "безрадовое" ядро дело). Мой рабочий стол (Ubuntu 11.10, 3.0.0 -...) имеет HZ = 250.

(отбракованный) o/p of:

$ cat /proc/interrupts 
   CPU0 CPU1 CPU2 CPU3 CPU4 CPU5  CPU6  CPU7       
0: 986465 0   0  6649423  0    0    0    184   IO-APIC-edge      timer
...
LOC: 239 266 252  226   197 4036054 2949226 2164947 Local timer interrupts
...

Как именно мы интерпретируем вышеупомянутый вывод? Кажется, у нас есть 2 источника прерывания таймера, один из таймера таймера APIC (IRQ0) и один из "локальной" (LOC) системы. Какое "реальное" прерывание таймера, которое перехватывает таймер OS IS? И если это происходит несколько раз на нескольких ядрах, то ОС обрабатывает все из них?