Вопрос операционной системы

Недавно я спросил себя: если запускается программа, например Mozilla Firefox, - ей должен быть предоставлен контроль. Но когда программа вылетает из строя, почему моя система не разбивается, как в ранней версии Windows?

  • Как Windows может вернуть элемент управления из программы или даже не дать ему полностью?

(Примечание: это не моя домашняя работа, я хожу в школу, но в моем классе информатики действительно есть только парни, которые ответят "Могу ли я есть это?", когда я спрашиваю их о ядрах. То же самое с моим учителем.)

Ответ 1

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

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

Другие вещи могут вызвать сбой.

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

Доступ к аппаратным портам из процесса, который не работает в надлежащем режиме, также приведет к сбою программы.

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

Ответ 2

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

Не все прерывания являются плохими (например, прерывания ввода-вывода для чтения с диска/сети). Однако, когда ОС сталкивается с плохим прерыванием, она будет либо:

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

Ответ 3

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

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

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

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

  • Чтение с недопустимого адреса памяти
  • Недостаточно памяти для этого конкретного приложения (однако пейджинг в основном устраняет эту проблему)
  • Попытка выполнить неиспользуемую память (например, данные)
  • Переход к недопустимому адресу (например, в середине машинной команды)

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

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

Ответ 4

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

Современные ОС (и Windows, так как NT/2K в любом случае) изолируют процессы друг от друга с помощью виртуальной памяти, а управление периодически передается от одного процесса к другому механизмом синхронизации, связанным с аппаратным прерыванием, известным как превентивная многозадачность. Если какой-то процесс выходит из строя и попадает в замкнутый цикл, это всего лишь вопрос времени (миллисекунды!) До того, как процесс dud будет выгружен, ОС получит контроль и перенесет его на следующий процесс. Если процесс идет неистовым и разыгрывает плохой указатель, он не может повредить другие данные процесса, потому что блок управления памятью (MMU) имеет каждую виртуальную память процесса, отображаемую в разные области физической памяти.

Теперь, когда обнаруживается, что программа выключена, это другое дело. Может быть, вы ХОТИТЕ закрутиться в узкой петле, это зависит от ОС, чтобы решить, что крушение? Поэтому, как правило, вы не видите программу, которая перешла в цикл, но вы увидите, что она загружает процессор. Сколько нагрузки зависит от того, как детали планировщика ОС, но, как правило, системные солдаты. Плохие указатели легче распознать, нулевой указатель является наиболее очевидным. Современные процессоры обычно имеют дескрипторы сегментов, которые могут использоваться для распознавания, когда была предпринята попытка обращения к нелегальной памяти, например, используя все пространство стека, выделенное для процесса. MMU обычно разрешает программам довольно либеральный доступ к адресному пространству, но если разработчик ОС так желает, MMU может быть настроен на то, чтобы отключить определенные виртуальные адреса, и если программа пытается получить доступ к одной из этих областей, исключение будет результат, который позволит ОС немедленно захватить контроль и обработать процесс нарушения.

Ответ 5

Это связано с тем, что современные операционные системы запускают процессы пользователя (в отличие от ядра) в виртуальной среде. Процесс имеет доступ к полному адресуемому диапазону памяти (это простое упрощение), но это виртуальная память. Он также использует процессор, но ядро ​​ time-slices все процессы, так что ЦП распределяются более или менее справедливо (опять же упрощение) среди всех процессов, поэтому это своего рода виртуальный процессор. Процесс не напрямую связан с оборудованием, а через ядро ​​syscall "API".

Ядро с помощью аппаратного обеспечения (MMU для доступа к памяти и разделение пользователя/супервизора для оценки привилегированной команды) защищает себя и пользовательские процессы друг от друга. Прекращение процесса пользовательского уровня с сбоем является нормальным, четко определенным событием для ядра.