#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.