Автоматически ли отключение прерывания отключает планирование процессора?

#operating-system #scheduling #interrupt

#операционная система #планирование #прерывать #прерывание

Вопрос:

Эй, ребята, это правда, что все планирование процессов / потоков будет отключено, если прерывание отключено? Что я знаю, так это то, что прерывание включает в себя тактовое прерывание и другие прерывания. Планирование процессора (например, циклическое) основано на тактовом прерывании. Если это отключено, планирование также отключается, и текущий поток продолжает выполняться до тех пор, пока не загрузит процессор. Пожалуйста, поправьте меня, если я ошибаюсь.

Если это чисто приоритетное планирование вместо RR (учитывая системы реального времени), и поток с более низким приоритетом отключает прерывание, то поступает поток с более высоким приоритетом, будет ли поток с более низким приоритетом вытеснен?

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

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

Комментарии:

1. Как правило, в режиме ядра нет ограничений на плохие данные. Все, что угодно в режиме ядра, может привести к сбросу управляющих регистров (пример: изменение базового адреса таблицы страниц на некоторое мусорное значение). Вот почему вам нужно быть администратором, чтобы добавлять драйверы. Вы должны указать, какую операционную систему и архитектуру вы имеете в виду, если таковые имеются.

2. Процессоры, обычно используемые во встроенных системах, будут включать сторожевой таймер. x86 также поддерживает сторожевой таймер, подключенный к NMI. Однако вредоносная программа может просто отключить сторожевой таймер и отключить прерывания.

Ответ №1:

На самом деле, ответ на ваш вопрос зависит от архитектуры. Давайте предположим, что речь идет о i386 или x86_64, поскольку это самые популярные процессорные архитектуры в наши дни.

Программа пользовательского режима не может снять флаг прерывания, поскольку для этого требуется CPL (текущий уровень привилегий) 0. Программы пользовательского режима никогда не имеют CPL 0. Например, в Linux программы пользовательского режима запускаются с CPL 2, и только ядро работает с CPL 0. Следовательно, вы не можете написать вирус, который отключил бы прерывания и, следовательно, отключил бы планирование. В Windows, если я не ошибаюсь, программы запускаются с CPL 1.

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

Надеюсь, это ответ на ваш вопрос.

Комментарии:

1. одна особенность отключения прерываний в режиме ядра заключается в том, что вы гарантированно не гарантируете, что никакой другой поток (например, какой-нибудь высокоприоритетный поток авто-вирусов) не сможет захватить процессор и уничтожить вирус, чтобы у вируса было достаточно времени, чтобы делать все, что он хочет. Имеет ли это смысл?

2. Программы пользовательского режима в Linux i386 запускаются с CPL =3, а не 2. С другой стороны, пользовательская программа МОЖЕТ отключить прерывания, если она запущена от имени root. Корневые процессы могут использовать системный вызов iopl() для понижения уровня IOPL до 3, поэтому процесс с CPL = 3 может использовать инструкции CLI и STI, которые чувствительны к IOPL, а не к CPL.