защищённость без защиты
Операционная система должна быть защищена от работающих в ней приложений, и обеспечивать защиту приложений друг от друга (привет от К.О.). Речь сейчас в основном не о вирусах/троянах, которые используют штатные возможности системы чтобы делать нехорошие вещи (здесь мы рано или поздно упрёмся в то, что отличить "хорошую" вещь от "нехорошей" не всегда просто), а о том, чтобы ошибки в обычном, не вредоносном, приложении (такие как обращение к "чужой" памяти) оставались внутри приложения и не приводили к нарушениям работы других приложений и собственно ОС. Сейчас для этого обычно используются аппаратные методы, такие как "защищённый режим" процессора: ОС выставляет процессу ограничения на используемые им ресурсы, процессор при выполнении кода аппаратно проверяет допустимость операций, и при выполнении операции, нарушающей ограничения, генерируется "исключение", обрабатываемое операционной системой ("программа выполнила и будет закрыта"), или отдаваемое приложению ("runtime error..."). И, хотя аппаратные проверки и замедляют работу (на любую проверку нужно время, кроме того - при переключении между процессами тратится время на перегрузку "описания ограничений" в процессоре), и увеличивают сложность процессора - всё равно по другому как бы вроде бы и не получится. Даже если конкретный компилятор порождает код, делающий все необходимые проверки - компиляторов много, кто-то может вообще использовать ассемблер или "писать в шестнадцатеричных кодах", а значит в выполняемом файле может оказаться инструкция, обращающаяся "не туда", эта инструкция может выполниться на реальном, аппаратном, процессоре, а при аппаратном выполнении инструкции единственный способ отследить "обращение не туда" - делать это аппаратно, на уровне процессора.
( Collapse )
( Collapse )