2013-02-26 3 views
5

Принцип обучения: Не существует такого понятия, как глупый вопрос. Основная идея заключается в том, что люди учатся, спрашивая. Меня спросили: «Можете ли вы показать и объяснить на уровне программирования, что плохо произойдет, если каждая задача может выполнять все инструкции».Использование прерывания Inter Processor

Я сделал дать код

main(){ 
     _asm_("cli;"); 
     while(1); 
    } 

и объяснил (систему замороженной хорошо- UP)

Тогда я спросил: «Можно ли привести пример так, чтобы система не замерзают даже эти прерывания очистки сделаны? "

Я сделал изменить предыдущий пример:

Я сделал дать код

main(){ 
     _asm_("cli;"); 
     i=i/0; 
     while(1); 
    } 

и объяснена его.

Тривиально: Если у нас есть спрос подкачка I =/0 причины первой ошибка страницы (страница данных нет) и другие задачи могут быть запланированы для запуска прерываний во время чтения диска и позже на деление на ноль отбросит эту задачу навсегда.

Но ответы были основаны на UP. Что относительно SMP? Я должен сказать, что ответы неполны. Он по-прежнему достаточно легко построить:

int i; 
    main(){ 
    for(i=0;i<100;i++)// Suppose we have less than 100 CPUs 
     if(fork()) 
     { sleep(5);//The generating task has (most probable) time to do all forks 
     _asm_("cli;"); 
     while(1); 
     } 
    } 

, который отключает прерывания для всех процессоров, потому что каждый процессор получает ядовитую задачу для запуска.

Даже до сих пор глупый вопрос выявил много хорошего, чтобы научиться новичкам: привилегированные инструкции, пейджинг, обработка ошибок, планирование во время DMA, fork ..... Но небольшое сомнение остается (позор мне) о первой программе, запущенной на SMP.

Будет ли один из CPU отсутствовать навсегда или нет? Другие процессоры продолжаются и могут отправлять re_schedule() IPI-сообщение. Что происходит? Легко предположить, что замороженный CPU не проснулся, потому что прерывания отключены. Но, чтобы быть абсолютно уверенным, нужно знать больше.

Вопрос был: Является ли прерывание между процессорами (IPI) масляным или немасштабируемым? Я имею в виду самые распространенные «популярные» реализации?

Извините, мой глупый вопрос. Невозможно найти ответ. Я буду искать его. Я имею в виду номер штыря прерывания (сообщение maskable, I guess).


Мой собственный ответ - правильный? Я изучил этот вопрос, потому что ему больше никто не понравился, придя к следующим мыслям:

С важными приложениями в режиме реального времени мы долгое время наблюдали сторожевой таймер (HW прерывая процессор, чтобы как-то ответить «Я жив»,). Например, у нас есть главный компьютер управления и резервный компьютер, заботящийся о системе, если главный компьютер выключен.

Что относительно Linux? Какой вид сторожевого у нас есть? Мы можем скомпилировать ядро ​​Linux с помощью сторожевого таймера или без него.

Что делает сторожевой таймер Linux? На многих() оборудовании типа x86/x86-64 есть функция, которая позволяет нам генерировать «прерывания NMI сторожевого таймера». Можно даже отключить сторожевой таймер NMI во время выполнения, написав «0» в/proc/sys/kernel/nmi_watchdog. Если какой-либо процессор в системе не выполняет прерывание локального таймера в течение более 5 секунд, APIC пытается исправить ситуацию с помощью маскирующего прерывания (процессор выполняет обработчик и убивает процесс)! (SCC Linux - это другое дело в отношении NMI.)

Мои ответы (в исходном вопросе) были основаны на системе без сторожевого таймера! Проблематично отвечать на общем уровне и приводить примеры на основе некоторой фиксированной системы. Ответы могут быть правильными или не зависят от процессора, конфигурации и настроек.

В любом случае, говорить о NMI действительно имеет смысл? Сделал это?

+3

После долгих исследований я отвечаю на свой вопрос (кому-то это не понравилось). – SikaS

ответ

0

Если ЦП не ограничивал доступ к некоторым инструкциям, было бы слишком легко случайно или преднамеренно вызвать катастрофу.

push $0 
push $0 
lidt (%esp) 
int $42 

Эта последовательность кода сбрасывает процессор x86. Вот почему:

  • Код загружает регистр IDTR таблицей дескриптора прерывания (IDT) с линейным адресом 0 с размером одного байта.
  • Восстанавливает прерывание 42, которое не может работать, поскольку оно превышает 1-байтовый предел IDT.
  • ЦП пытается повысить общую защиту, прерывание 13. Это также не удается, так как прерывание 13 выходит за пределы одного байта.
  • ЦПУ пытается поднять исключение с двойной ошибкой, прерывание 8. Это тоже не удается, прерывание 8 выходит за пределы IDT.

Это известно как тройной отказ. ЦП выполняет цикл выключения шины, чтобы сообщить материнской плате, что теперь он игнорирует все и прекращает выполнение. Материнская плата утверждает, что перезагружает компьютер.

Это фактически незначительно по сравнению с тем, что может сделать код. Кодовая последовательность может легко захватить машину в целом и начать уничтожать все данные на жестком диске, она может отправлять все ваши файлы на вредоносный сервер в Интернете, он может изменять ваш пароль, включать удаленный доступ, подключаться к вредоносного сервера и предоставить злоумышленнику неограниченный доступ к оболочке. Нет никакого ограничения на то, что программа могла бы сделать.

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

Смежные вопросы